1. 程式人生 > 其它 >C++筆記(八)

C++筆記(八)

技術標籤:c++

智慧指標模板類:

智慧指標是行為類似於指標的類物件。但這種物件還有其他功能。

void remodel(std::string &str)
{
	std::string *ps=new std::string(str);
	...
	str=ps;
	retrun;
}

有缺陷。每當呼叫時,該函式都分配堆中的記憶體,但從不收回,從而導致記憶體洩漏。解決:在return 語句前加上delete ps;即可

智慧指標的思想當函式退出時,本地變數都將從棧記憶體中刪除—因此指標ps佔據的記憶體將被釋放。如果ps指向的記憶體也被釋放,那該有多好。如果ps有一個解構函式,該解構函式將在ps過期時釋放它指向的記憶體。因此,ps的問題在於,它只是一個常規指標,不是有解構函式的類物件。如果它時物件,則可以在物件過期時,讓它的解構函式刪除指向它的記憶體。這正是智慧指標的背後思想

auto_ptr 能在指標退出作用域時,自動釋放其物件記憶體
特點:
1,當指標封裝在類內部,當臨時物件auto_ptr退出時,類A解構函式自動被呼叫
2,當多個auto_ptr發生拷貝構造或者賦值時,只有最有一個auto_ptr有效
3,該介面在新的C++標準中已被廢棄-----一旦進行賦值、拷貝構造,那麼原先的智慧指標就會喪失控制權,但是原先的指標竟然還是可以使用,這是存在系統漏洞的。

auto_ptr<A> p2(new A(2));
p2.get()->info();

 auto_ptr<A> p3(p2);
 p2.get()->info()
; // 這裡可能會觸發異常甚至程式中斷,因為p2已經喪失了物件的控制權 p3.get()->info();

智慧指標 shared_ptr 能在指標退出作用域時,自動釋放其物件記憶體
特點:
1.當指標封裝在類內部,當臨時物件shared_ptr退出時,類A解構函式自動被呼叫
2.當多個shared_ptr發生拷貝構造或者賦值時,他們將共享這個堆物件

 shared_ptr<A> p2(new A(2));
 p2.get()->info();

  shared_ptr<A> p3(p2);
  p2.get()->info();
  p3.get
()->info(); shared_ptr<A> p4; p4 = p2; p4.get()->setID(200); p2.get()->info(); p3.get()->info(); p4.get()->info();

智慧指標 unique_ptr 能在指標p2退出作用域時,自動釋放其物件記憶體
特點:
1,當指標封裝在類內部,當臨時物件unique_ptr退出時,類A解構函式自動被呼叫
2,不允許多個unique_ptr發生拷貝構造或者賦值

 unique_ptr<A> p2(new A(2));
 p2.get()->info();

 unique_ptr<A> p3(p2);//這是錯誤的,編譯不過