C 智慧型指標shared array

2021-07-06 04:07:31 字數 2774 閱讀 6091

這幾天寫乙個程式,經常用到動態分配的指標,然後自己又有強迫症,每次動態分配之後,不delete或者delete掉,就不舒服,但是同時自己又有健忘症,有時候寫著寫著,又忘了delete或者delete了,想起來前段時間了解到的智慧型指標,可以在變數生存週期結束後,自動釋放記憶體,這讓我甚是歡喜,何不來試試?但是畢竟是初次使用,所以還是先做了一些程式測試,避免後面出bug。因為主要用到的是動態分配的陣列,所以本文主要介紹shared_array。比較詳細和總體的介紹,大家可以參考

首先介紹一下這個智慧型指標從**來,首先,memory標頭檔案在表示智慧型指標的std命名空間中定義了如下型別(截圖來自vc++2012入門經典):

當然,其實仔細看一下,裡面還有幾種其他型別的智慧型指標定義,也就不一一說了,這裡不是重點。

然後在使用boost中定義的智慧型指標時,只要包含標頭檔案#include ,再加上using namespace boost就可以使用了。

上圖截自boost庫關於smart pointers的說明文件(也就是定義了六中智慧型指標,有興趣的自己去學習下,本文還是只講一下shared_array了。

shared_array的類摘要如下:         

namespace boost ;

templatebool operator==(shared_arrayconst & a, shared_arrayconst & b); // never throws

templatebool operator!=(shared_arrayconst & a, shared_arrayconst & b); // never throws

templatebool operator

templatevoid swap(shared_array& a, shared_array& b); // never throws

}

好了,下面直接就上測試**吧,為了簡單,我用了int型別的動態陣列,當然,也可以換成其他的資料型別或者類,不然這個就太侷限了。。

#include #include using namespace std;

using namespace boost;

int main()

shared_arraysmart_int_array(int_array);// 將陣列定義位智慧型指標

// 不同的引用陣列方式

cout << "訪問方式1:通過原始陣列名來訪問" << endl;

for (int i = 0; i < 10; i++)

cout << endl;

cout << "訪問方式1:通過智慧型指標訪問" << endl;

for (int i = 0; i < 10; i++)

cout << endl;

// 另外一種定義智慧型指標的方法,也就是先定義,後賦值的方法

// 測試結果證明也是可行的

shared_arraysmart_int_array2;

// 下面要注意了,在初始化的時候,不能再用int_array作為形參了

// 也沒仔細分析原因,最後程式會出現崩潰,也就是說,同乙個陣列

// 只能用乙個智慧型指標來管理吧

smart_int_array2 = shared_array(new int[10]);

for (int i = 0; i < 10; i++)

cout << "先定義,再初始化,再賦值的方式" << endl;

for (int i = 0; i < 10; i++)

cout << endl;

// // 再有就是最有意思的了 ///

// 我先定義乙個陣列

int *int_array2 = new int[10];// 動態分配乙個陣列

for (int i = 0; i < 10; i++)

// 下面驗證發現輸出的值沒有問題

cout << endl << "定義智慧型指標前陣列的值:" << endl;

for (int i = 0; i < 10; i++)

cout << endl;

// 我再在乙個區域性作用域內為該陣列指定乙個智慧型指標

if (true)

// 當出了這個作用域,智慧型指標被銷毀,我們再來看下原始陣列變了沒

cout << "智慧型指標銷毀後陣列的值:" << endl;

for (int i = 0; i < 10; i++)

cout << endl;

return 1;

}

程式輸出結果如下圖:

尤其是最後乙個部分,我是覺得很神奇的,說明不管你原始陣列定義的作用域在**,只要在其上定義的智慧型指標別銷毀了,那麼,這部分空間也就被銷毀了,那麼再輸出的話,看到的都是一些無效值了,在使用中還是要注意的。

另外,關於定義方式,還是比較好的,定義時不需要馬上初始化和賦值,再加上陣列的訪問操作符仍然存在,最後還不需要我們手動delete,真是再好不過了。

(說的不對的,望指正,謝謝!)

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

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