boost庫在工作(9)引用計數的智慧指標shared_ptr之二
阿新 • • 發佈:2019-02-15
接著下來,需要演示一下怎麼樣在多個物件裡共享一個物件,而不管每個物件的生命週期,就可以及時地把使用的物件在合適地方刪除。下面的例子裡先定義兩個類,然後每個類都引用共享的物件,接著使用完成後,就會在解構函式裡刪除,可以從例子程式執行的輸出結果看到內部執行的生命週期。有了共享智慧指標,面對多個物件共享使用一個物件,這樣的管理會方便很多。具體程式碼如下:
//在兩個物件之間共享使用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. 如果有多個執行緒的情況下,需要加鎖對智慧指標進行賦值和刪除。如果只是讀取智慧指標的物件,是沒有任何問題。