C 智慧型指標

2021-09-17 20:58:20 字數 1791 閱讀 5490

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

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