四種auto_ptr、 unique_ptr、 shared_ptr、 weak_ptr。
class base
}
auto_ptr:
auto_ptrp1(new base());
p1->print();
auto_ptrp2 = p1;//野指標p1產生
p2->print();
p1->print();//錯誤
auto_ptr會在程式退出的時候進行物件的釋放,比我們手動的new和delete方便很多,以上一段**可以說明問題。auto_ptr指標並不完全安全,當他的物件轉移的時候就會產生野指標,也就是控制權進行了轉移,當p2=p1時,p1的控制權就已經轉移到p2了,p1就成了野指標,當再使用p1 的時候就會報錯。
unique_ptr:
unique_ptrp1(new base());
p1->print();
unique_ptrp2=p1;//錯誤
unique_ptrp3(p1);//錯誤
這個指標比較自私,一旦使用之後,就會獲取所有控制權,不能進行轉移,也就是說只能存在乙份,不能進行直接構造和直接複製。但是可以移動構造和複製,當然隨著移動構造和複製,控制權也要進行轉移,也就是說跟auto_ptr是一樣的了。
unique_ptrget_ptr()
unique_ptrp2 = get_ptr();//這個地方控制權轉移,p1無效,如果p1是個成員變數最好不要這麼做,否則會導致p1失效成為野指標,後期再想使用就會出錯。
shared_ptr:
shared_ptrp1 (new base());//引用計數加1
p1->print();
shared_ptrp2=p1;//引用計數加1
p2->print();
shared_ptrp3(p1);//引用計數加1
p3->print();
這個指標使用比較常見。shared_ptr可以多個指標指向同乙個物件,在每增加乙個shared_ptr的時候,物件的引用計數會自增加1,每當智慧型指標銷毀了,引用計數就減1,當引用計數減少到0的時候就釋放引用的物件。每個指標擁有這個物件的所有權,就是說每個指標都可以單獨的使用裡面的變數。特別注意shared_ptr不能迴圈使用,即:
class a
class b
shared_ptrpa(new a);
shared_ptrpb(new b);
pa->p = pb;
pb->p = pa;
weak_ptr:
weak_ptr是shared_ptr的延申,一般與shared_ptr一起使用,主要是為了防止迴圈引用導致的記憶體洩漏問題。weak_ptr不會擁有物件的所有權,而且他還不能直接使用他所引用的物件,也不會增加物件的引用計數。當weak_ptr轉換成shared_ptr的時候才會擁有所有權(使用weak_ptr的lock()方式進行轉換),轉換後weak_ptr的引用計數增加1。如果物件銷毀,weak_ptr無效,即指向空。
void function()
assert(wp.use_count() == 1);
return 0;
}
總結:
1. 盡量使用unique_ptr而不要使用auto_ptr
2. 一般來說shared_ptr能夠滿足我們大部分的需求
3. weak_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 智慧型指標
記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...