普通指標到智慧型指標的轉換
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...