您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“C++中智能指針代碼的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“C++中智能指針代碼的示例分析”這篇文章吧。
如果在程序中使用new從堆分配內(nèi)存,等到不再需要時(shí),應(yīng)使用delete將其釋放,C++引入了智能指針auto_ptr,以幫助自動(dòng)完成這個(gè)過(guò)程,但是aoto_ptr也有其局限性,因此從Boost庫(kù)中又引入了三種智能指針unique_ptr shared_ptr weak_ptr。
// ConsoleApplication1.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。 // #include "stdafx.h" #include <memory> #include <string> #include <iostream> #include <ostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { auto_ptr<string> ptr1(new string("this is ptr!")); auto_ptr<string> ptr2; ptr2 = ptr1; cout << &ptr2<<endl; cout << *ptr2 << endl; return 0; }
output :
003AFBC0
this is ptr!
但是如果輸出的是ptr1,程序會(huì)如何呢?
#include "stdafx.h" #include <memory> #include <string> #include <iostream> #include <ostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { auto_ptr<string> ptr1(new string("this is ptr!")); auto_ptr<string> ptr2; ptr2 = ptr1; cout << &ptr1 <<endl; cout << *ptr1 << endl; #這一步程序會(huì)崩潰 return 0; }
崩潰原因: 首先ptr2 = ptr1表示ptr1將訪問(wèn)的權(quán)限給了ptr2,同時(shí)意味了ptr1已經(jīng)沒(méi)有訪問(wèn)字符串的權(quán)限,因此會(huì)報(bào)錯(cuò)。
那如何解決這個(gè)問(wèn)題呢?引入了unique_ptr
#include "stdafx.h" #include <memory> #include <string> #include <iostream> #include <ostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { unique_ptr<string> ptr1(new string("this is unique_ptr")); unique_ptr<string> ptr2; ptr2 = ptr1; #這一步編譯器會(huì)報(bào)錯(cuò) return 0; }
unique_ptr 替代auto_ptr實(shí)現(xiàn)獨(dú)占式,可以理解成,同一時(shí)刻只能有一個(gè)unique_ptr指向給定對(duì)象,unique_ptr對(duì)象始終是關(guān)聯(lián)的原始指針的唯一所有者。無(wú)法復(fù)制unique_ptr對(duì)象,它只能移動(dòng)。(這樣可以保證,不會(huì)出現(xiàn)auto_ptr那樣運(yùn)行時(shí)會(huì)出現(xiàn)的隱藏內(nèi)存崩潰問(wèn)題)
int _tmain(int argc, _TCHAR* argv[]) { unique_ptr<string> ptr1(new string("this is unique_ptr")); unique_ptr<string> ptr2; cout << &ptr1 << endl; unique_ptr<string> ptr3(new string("other unique_ptr")); cout << &ptr3 << endl; cout << *ptr3 << endl; return 0; }
output:
00D9F8B4
00D9F89C
other unique_ptr
// ConsoleApplication1.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。 // #include "stdafx.h" #include <memory> #include <string> #include <iostream> #include <ostream> using namespace std; class base{ public: base() { cout << "begin..." << endl; }; ~base() { cout << "end..." << endl; } }; int _tmain(int argc, _TCHAR* argv[]) { base *a = new base(); shared_ptr<base> ptr1(a); //shared_ptr<base> ptr2(a); ## 如果加上這句程序會(huì)崩潰,雙重管理陷阱,a對(duì)象被刪除了兩次 return 0; }
output:
begin...
end...
share_ptr的循環(huán)陷阱
#include "stdafx.h" #include <memory> #include <string> #include <iostream> #include <ostream> using namespace std; class CB; class CA { public: CA() { cout << "CA call ..."<< endl; } ~CA() { cout << "~CA call..."<< endl; } void setPtr(shared_ptr<CB> &ptr) { m_ptr_b = ptr; } int getCount() { return m_ptr_b.use_count(); } private: shared_ptr<CB> m_ptr_b; }; class CB { public: CB() { cout << "CB call..." << endl; } ~CB() { cout << "~CB call..." << endl; } void setPtr(shared_ptr<CA> ptr) { m_ptr_a = ptr; } int getCount() { return m_ptr_a.use_count(); } private: shared_ptr<CA> m_ptr_a; }; int _tmain(int argc, _TCHAR* argv[]) { shared_ptr<CA> ptr_a(new CA); shared_ptr<CB> ptr_b(new CB); cout << " CA count is : " << ptr_a->getCount()<<endl; cout << "CB count is:" << ptr_b->getCount()<< endl; ptr_a->setPtr(ptr_b); ptr_b->setPtr(ptr_a); cout << " CA count is : " << ptr_a->getCount() << endl; cout << "CB count is:" << ptr_b->getCount() << endl; return 0; }
上面這段程序的思路用下面張圖可以清晰的表示
圖片和代碼主要參考的是這篇很棒的博文:智能指針(三):weak_ptr淺析
運(yùn)行結(jié)果后發(fā)現(xiàn)并沒(méi)有調(diào)用析構(gòu)函數(shù)釋放內(nèi)存,以后存在內(nèi)存泄漏的風(fēng)險(xiǎn)
那如何去解決這個(gè)問(wèn)題呢?,可以通過(guò)引入weak_ptr來(lái)解決,但是weak_ptr需要與share_ptr配合使用
通過(guò)在兩個(gè)類(lèi)中的一個(gè)成員變量改為weak_ptr對(duì)象,因?yàn)閣eak_ptr不會(huì)增加引用計(jì)數(shù),使得引用形不成環(huán),最后就可以正常的釋放內(nèi)部的對(duì)象,不會(huì)造成內(nèi)存泄漏
class CB { public: CB() { cout << "CB call..." << endl; } ~CB() { cout << "~CB call..." << endl; } void setPtr(shared_ptr<CA> ptr) { m_ptr_a = ptr; } int getCount() { return m_ptr_a.use_count(); } private: ///shared_ptr<CA> m_ptr_a; weak_ptr<CA> m_ptr_a; ## 改為weak_ptr對(duì)象 };
以上是“C++中智能指針代碼的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。