C++筆記(八)
阿新 • • 發佈:2020-12-24
技術標籤: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);//這是錯誤的,編譯不過