c++資源管理是乙個很重要的問題,c++智慧型指標就是為了管理資源而產生的。
考慮如下**:
void f()
看起來很正確,new和delete成對存在,申請的資源進行了釋放。然後,如果在delete之前,如果由於某些原因,比如...中執行了return語句,導致無法執行delete語句控制流就離開了f()。
為了解決這種情況,使用了raii機制。raii機制就是在資源建立出來的時候立即將其放入乙個區域性物件中,當區域性物件離開作用域出棧時,會呼叫區域性物件的析構函式,在析構函式裡執行資源的釋放。
智慧型指標就是實現raii機制的典型實現。
早期的智慧型指標,比如auto_ptr,就是這種思想的簡單實現。
void f()
在離開f()時,auto_ptr物件的析構函式會對delete掉其指向的物件。
考慮一下,如果有兩個auto_ptr指向同乙個物件的場景,物件可能會被delete兩次從而產生未定義行為。
因此,受auto_ptr管理的物件保證同一時間不能有乙個以上的auto_ptr同時指向它。在第二個auto_ptr指向物件時,會發生控制權的轉移(move), 使得只有新的auto_ptr唯一指向物件。
auto_ptr的替代品是「引用計數型智慧型指標」。
最常見的引用計數型智慧型指標是shared_ptr。
引用計數的行為如下:
shared_ptr看起來很完美,然而實際上還存在乙個很致命的問題——迴圈引用問題。
這裡引用某篇部落格的例子:
#include#includeusing namespace std;
struct node
;int main()
上面的**我們定義了兩個塊空間,我們可以 分別成它們為node1,node2。p1,sp2,_next,_prev均為shared_ptr型別的智慧型指標。sp1與sp2->prev都指向node1,所以sp1的引用計數為2,同理sp1->_next與sp2都指向node2,所以sp2的引用計數也為2。
在這種情況下,node1和node2永遠都不會被釋放。如果不想修改類的關係的設計,可以用weak_ptr解決這個問題。
weak_ptr是為配合shared_ptr而引入的一種智慧型指標來協助shared_ptr工作,它可以從乙個shared_ptr或另乙個weak_ptr物件構造,它的構造和析構不會引起引用記數的增加或減少。
struct node
;int main()
這樣就可以不會出現迴圈引用的問題了。 c 智慧型指標
auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...
c 智慧型指標
很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...
c 智慧型指標
記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...