c 智慧型指標

2021-08-19 23:27:40 字數 2524 閱讀 8779

c++智慧型指標

c++11之前的auto_ptr; c++11新加的unique_ptr, shared_ptr以及weak_ptr。

標頭檔案:#include

1.auto_ptr

std::auto_ptr是我第乙個看的智慧型指標,也是標準庫里的智慧型指標,有許多缺陷。 使用方式:  auto const ptr = std::auto_ptr(new int);

首先看下結構:

從圖中可以看書也是乙個模板,使用方法大致類似於vector模板。如下:

class base1  

};//先寫乙個測試類  

main函式如下:

int _tmain(int argc, _tchar* argv)  

return 0;  

}  正常用法是這樣,然而我們可以再仔細翻看下底層:

從上圖可以看出,該智慧型指標成員函式也與vector相似,很容易得出

1、base1.get():返回當前指標物件;

2、base1.release():清空當前智慧型指標物件,並返回型別指標。所以假如我們要正常刪除,那麼需要這樣:

base1*base2 = base1.release();  

delete base2;  

很麻煩對不對,沒關係,還有第三個函式呢

3、base1.reset():從圖中可看出,是重置智慧型指標,即把記憶體刪除,且智慧型指標指向空,但型別不變,所以可以這樣安全便捷地刪除:

base1.reset();  

然而繼續看,還有乙個問題:

auto_ptr還過載了等號操作符,由圖可知意思是把賦值智慧型指標的記憶體交給被賦值智慧型指標,即如下意思:

auto_ptr base2;  

base2 = base1;//將base1的控制權轉交給base2,且base1清空了  等同於base2(base1)

2、接下來,還有兩個函式:

其實auto_ptr也有,只是一樣,沒必要截圖了)也就是說,auto_ptr和unique_ptr都可以通過move函式轉換成shared_ptr型別,當然,一樣是切換控制權的形式,即舊的置空。

用法如下:

auto_ptrbase1(new base1);  

shared_ptrbase2=move(base1);  

4.weak_ptr

std::weak_ptr是解決野指標問題的乙個很好的方法。通過使用原始指標,不可能知道引用的資料是否已被釋放。相反,通過std::shared_ptr管理資料std::weak_ptr並向使用者提供資料,使用者可以通過呼叫expired()或檢查資料的有效性lock()。你不能std::shared_ptr單獨做到這一點,因為所有std::shared_ptr例項共享資料的所有權,在刪除所有例項之前,資料不會std::shared_ptr被刪除。就好像你本地設定乙個(擁有)指標為空(刪除記憶體),所有其他(弱)指向同一記憶體的指標也設定為空

weak_ptr用於解決」引用計數」模型迴圈依賴問題,weak_ptr指向乙個物件,並不增減該物件的引用計數器。weak_ptr用於配合shared_ptr使用,並不影響動態物件的生命週期,即其存在與否並不影響物件的引用計數器。weak_ptr並沒有過載operator->和operator *操作符,因此不可直接通過weak_ptr使用物件。weak_ptr提供了expired()與lock()成員函式,前者用於判斷weak_ptr指向的物件是否已被銷毀,後者返回其所指物件的shared_ptr智慧型指標(物件銷毀時返回」空」shared_ptr)。

以下是使用以下方法檢查懸掛指標的示例:

weak_ptr更像是shared_ptr的助手:

1、他不像其餘三種,可以通過建構函式直接分配物件記憶體;他必須通過shared_ptr來共享記憶體。

2、沒有過載opreator*和->操作符,也就意味著即使分配到物件,他也沒法使用該物件

3、不主動參與引用計數,即,share_ptr釋放了,那麼weak_ptr所存的物件也釋放了。

4、使用成員函式use_count()可以檢視當前引用計數,expired()判斷引用計數是否為空。

5、lock()函式,返回乙個shared_ptr智慧型指標:

也就是讓weak_ptr觀測shared_ptr智慧型指標,並且在需要時候通過lock函式返回乙個shared_ptr。

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

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