c 智慧型指標

2021-08-22 00:19:48 字數 1492 閱讀 3674

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 智慧型指標

記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...