C++11之智能指針

shared_ptr

shared_ptr是帶引用計數(shù)的指針。只有當(dāng)引用計數(shù)為 0 的時候,才會釋放所指的對象。
shared_ptr 不需要程序員手工調(diào)用 AddRef 和 Release 函數(shù),進一步減小了內(nèi)存出錯的可能性。

int main( )
{
    std::shared_ptr<double> p_first(new double);  // 引用計數(shù)=1
    {
        std::shared_ptr<double> p_copy = p_first ; // 引用計數(shù)+1=2
        *p_copy = 1.234;
    }  // 局部變量p_copy釋放,引用計數(shù)-1=1,double對象仍存在
    return 0;  // p_first釋放,指向double的shared_ptr引用計數(shù)=0,double對象被釋放
}

使用 shared_ptr 要注意的可能會引起循環(huán)引用的代碼結(jié)構(gòu)。比如:有對象 A 和 B,其各有一個指針指向?qū)Ψ健?/p>

class A
{
  ...
  std::shared_ptr<B> pB;
  ...
};
class B
{
  ...
  std::shared_ptr<A> pA;
  ...
};
int main () {
  std::shared_ptr<A> a(new A());
  std::shared_ptr<B> b(new B());

  a->b = b; 
  b->a = a;

  return 0;
}

在程序運行結(jié)束時,A,B的對象都不能夠被正確釋放,因為:
如果釋放A,但B內(nèi)部仍存有指向A的一個引用計數(shù);
如果釋放B,但A內(nèi)部仍存有指向B的一個引用計數(shù)。

weak_ptr

類似線程安全方面的死鎖問題,為了解決循環(huán)引用問題,可以使用 weak_ptr。
weak_ptr并不擁有它所指向的對象,因此不影響該對象的銷毀與否。
對上例做如下調(diào)整后,解決對象不能正常銷毀的問題。

class A
{
  ...
  std::weak_ptr<B> pB;
  ...
};
class B
{
  ...
  std::weak_ptr<A> pA;
  ...
};
int main () {
  std::shared_ptr<A> a(new A());
  std::shared_ptr<B> b(new B());

  a->b = b; 
  b->a = a;

  return 0;
}

weak_ptr的特點:

  • weak_ptr指向的是一個被shared_ptr所指向的對象。
  • weak_ptr可以用來決定該對象是否已被銷毀。
  • weak_ptr不能被直接解引用;

想要訪問其內(nèi)部所保存的指針,必須通過shared_ptr,有兩種方法:
第一,以weak_ptr為參數(shù),構(gòu)造一個shared_ptr.

shared_ptr<B> pB(a->b);
pB->foo();

第二,通過weak_ptr的lock()成員函數(shù),返回一個shared_ptr

shared_ptr<B> pB = a->b.lock();
pB->foo();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原作者:Babu_Abdulsalam 本文翻譯自CodeProject,轉(zhuǎn)載請注明出處。 引入### Ooops...
    卡巴拉的樹閱讀 30,376評論 13 74
  • 1. 什么是智能指針? 智能指針是行為類似于指針的類對象,但這種對象還有其他功能。 2. 為什么設(shè)計智能指針? 引...
    MinoyJet閱讀 711評論 0 1
  • 12.1 智能指針 智能指針行為類似普通指針,但它負(fù)責(zé)自動釋放所知的對象。 #include <memory> s...
    龍遁流閱讀 439評論 0 1
  • 《影響力》主要是講述一些善于利用順從原理的人來達到讓我們走進他們的計劃進而達成自己的目的。這些順從原理包括:互惠,...
    小呆呆閱讀 475評論 0 0
  • 野獸派 馬蒂斯 21歲才學(xué)畫 戴帽子的婦人 我不是在創(chuàng)作一個女人,而是在畫一幅畫。 二徐之爭 潘玉良 關(guān)紫蘭 ...
    唐寶寶寶寶閱讀 210評論 0 0

友情鏈接更多精彩內(nèi)容