1. 程式人生 > >boost庫在工作(9)引用計數的智慧指標shared_ptr之二

boost庫在工作(9)引用計數的智慧指標shared_ptr之二

接著下來,需要演示一下怎麼樣在多個物件裡共享一個物件,而不管每個物件的生命週期,就可以及時地把使用的物件在合適地方刪除。下面的例子裡先定義兩個類,然後每個類都引用共享的物件,接著使用完成後,就會在解構函式裡刪除,可以從例子程式執行的輸出結果看到內部執行的生命週期。有了共享智慧指標,面對多個物件共享使用一個物件,這樣的管理會方便很多。具體程式碼如下:

//在兩個物件之間共享使用shared_ptr
//軟體開發人員: 蔡軍生  2013-02-09
class CObjA
{
public:
	CObjA(boost::shared_ptr< int > pA)
		:m_pA(pA)
	{

	}

	~CObjA()
	{
		std::cout << "m_pA.use_count() :" << m_pA.use_count() << std::endl;
	}

	void Print(void)
	{
		std::cout << "A Print = " << *m_pA << std::endl;
	}
private:
	boost::shared_ptr< int > m_pA;
};

class CObjB
{
public:
	CObjB(boost::shared_ptr< int > pB)
		:m_pB(pB)
	{

	}

	~CObjB()
	{
		std::cout << "m_pB.use_count() :" << m_pB.use_count() << std::endl;
	}

	void Print(void)
	{
		*m_pB += 100;
		std::cout << "B Print = " << *m_pB << std::endl;
	}
private:
	boost::shared_ptr< int > m_pB;
};

void TestObj(void)
{
	//建立一個共享指標。
	boost::shared_ptr< int > pObj(new int);
	*pObj = 10;

	//傳給兩個物件使用。
	CObjA objA(pObj);
	CObjB objB(pObj);

	objA.Print();
	objB.Print();

	//
	CObjA* pObjA = new CObjA(pObj);
	pObjA->Print();
	delete pObjA;

	//賦值操作。
	boost::shared_ptr< int > pLast = pObj;
	std::cout << "pLast.use_count() :" << pLast.use_count() << std::endl;

	//比較操作
	if (pLast == pObj)
	{
		std::cout << "pLast == pObj" << std::endl;
	}
}

例子執行的結果如下:

100

A Print = 10

B Print = 110

A Print = 110

m_pA.use_count() :4

pLast.use_count() :4

pLast == pObj

m_pB.use_count() :3

m_pA.use_count() :2

請按任意鍵繼續. . .

從上面的例子看到,可以使用函式use_count()來檢視引用計數,這樣方便除錯和做單元測試,以及自動化測試。不過,在使用智慧指標shared_ptr時,需要注意下面幾個問題:

1. 不要讓智慧指標構造迴圈引用的情況,否則引用計數的技術就會失效,導致記憶體物件不能刪除。

2. 不要讓智慧指標構造沒有名字的臨時物件。

3. 如果有多個執行緒的情況下,需要加鎖對智慧指標進行賦值和刪除。如果只是讀取智慧指標的物件,是沒有任何問題。