普通指標到智慧型指標的轉換

2021-07-09 10:35:33 字數 1433 閱讀 7417

普通指標到智慧型指標的轉換

int

*iptr

=new

int(

42);

shared_ptr

<

int>p(

iptr

);

智慧型指標到普通指標的轉換

int*pi

=p.get

();

注意的地方:那就是不要將智慧型指標與普通指標混用。如果專案允許,堅持使用智慧型指標,避免原生指標。

智慧型指標與普通指標需要特別特別特別的小心翼翼,比如以下的情況。

1. 普通指標到智慧型指標的問題

voidf(

shared_ptr

<

int>

ptr)

//增加引用計數

//銷毀ptr,減少引用計數

我們有如下的**:

int* iptr = new int(42);

f(shared_ptr(iptr));

int value = *iptr; // error! iptr指標指向的內容已經被釋放

因為在這兒,你將普通指標賦予給了乙個臨時的智慧型指標,當呼叫f函式完畢後,此臨時智慧型指標的生命週期結束,然後減少引用計數,歸為0,於是,記憶體釋放!

而這兒的更改方法是一直使用智慧型指標:

autop=

make_shared

<

int>(42

);// 初始化的引用計數為1f(

p);// 拷貝後增加為2,銷毀ptr減少1,然後變為1

intvalue=*

p;//引用計數為1

2. 智慧型指標到普通指標的問題

autop=

make_shared

<

int>(42

);int

*iptr=p

.get

();int

value=*

p;// error! 記憶體已經被釋放

p與iptr指向了相同的記憶體,然而通過get方法後,將記憶體管理權轉移給了普通指標。iptr傳遞給裡面程式塊的臨時智慧型指標後,引用計數為1,隨後出了作用域,減少為0,釋放記憶體。

額外的注意點:轉換

在c++11中,極力推崇完全替代原生指標。而這裡面,原生指標使用到了static_cast,dynamic_cast, const_cast的操作,需要用static_pointer_cast, dynamic_pointer_cast, const_pointer_cast對應操作,而並非使用原來的dynamic_cast等。

C 智慧型指標和普通指標引數的使用問題

char str char pvargtocompletionroutine string ss str 記憶體洩漏 給乙個物件申請一塊記憶體空間,由於某種原因這塊記憶體未釋放掉,這塊記憶體被占用導致應用卡頓等。記憶體溢位 擁有一塊20位元組的記憶體空間,你將30位元組的檔案寫入其中,就會造成溢位。...

普通指標與陣列指標的區別

去部落格設定頁面,選擇一款你喜歡的 片高亮樣式,下面展示同樣高亮的 片.二維陣列的幾個符號的測試 1 a等同於 a 0 2 a 0 等同於 a 0 0 3 在數值上 a a a 0 a 0 a 0 0 是相等的,但是在型別上面是有區別的。include include main int p1 5 陣...

vector push back普通指標的感想

include include vector push back是變數內容的拷貝,而且是深拷貝,對於資料來說,變數中儲存的內容就是變數值。對於指標來說,變數內儲存的內容是指標指向的記憶體位址。1 2 3 4 5 5 5 5 1 2 3 4 void test1 std cout std endl n...