C 智慧型指標 weak ptr

2022-09-15 23:33:19 字數 3543 閱讀 3217

weak_ptr 是一種不控制物件生命週期的智慧型指標, 它指向乙個 shared_ptr 管理的物件. 進行該物件的記憶體管理的是那個強引用的 shared_ptr. weak_ptr只是提供了對管理物件的乙個訪問手段.

weak_ptr 設計的目的是為配合 shared_ptr 而引入的一種智慧型指標來協助 shared_ptr 工作, 它只可以從乙個 shared_ptr 或另乙個 weak_ptr 物件構造, 它的構造和析構不會引起引用記數的增加或減少.

定義在 memory 檔案中(非memory.h), 命名空間為 std.

weak_ptr 使用:

std::shared_ptrsp(new int(10));

std::weak_ptrwp(sp);

wp = sp;

printf("%d\n", wp.use_count()); // 1

wp.reset();

printf("%d\n", wp); // 0

// 檢查 weak_ptr 內部物件的合法性.

if (std::shared_ptrsp = wp.lock())

weak_ptr 沒有過載*和->但可以使用 lock 獲得乙個可用的 shared_ptr 物件. 注意, weak_ptr 在使用前需要檢查合法性.

expired 用於檢測所管理的物件是否已經釋放, 如果已經釋放, 返回 true; 否則返回 false.

lock 用於獲取所管理的物件的強引用(shared_ptr). 如果 expired 為 true, 返回乙個空的 shared_ptr; 否則返回乙個 shared_ptr, 其內部物件指向與 weak_ptr 相同.

use_count 返回與 shared_ptr 共享的物件的引用計數.

reset 將 weak_ptr 置空.

weak_ptr 支援拷貝或賦值, 但不會影響對應的 shared_ptr 內部物件的計數.

使用 shared_ptr 時, shared_ptr 為強引用, 如果存在迴圈引用, 將導致記憶體洩露. 而 weak_ptr 為弱引用, 可以避免此問題, 其原理:

對於弱引用來說, 當引用的物件活著的時候弱引用不一定存在. 僅僅是當它存在的時候的乙個引用, 弱引用並不修改該物件的引用計數, 這意味這弱引用它並不對物件的記憶體進行管理.

weak_ptr 在功能上類似於普通指標, 然而乙個比較大的區別是, 弱引用能檢測到所管理的物件是否已經被釋放, 從而避免訪問非法記憶體。

注意: 雖然通過弱引用指標可以有效的解除迴圈引用, 但這種方式必須在程式設計師能預見會出現迴圈引用的情況下才能使用, 也可以是說這個僅僅是一種編譯期的解決方案, 如果程式在執行過程**現了迴圈引用, 還是會造成記憶體洩漏.

class

cb;

class

ca;

class

ca

~ca()

void register(const std::shared_ptr&sp)

private

: std::weak_ptr

m_spb;

};class

cb ;

~cb();

void register(const std::shared_ptr&sp)

private

: std::shared_ptr

m_spa;

};std::shared_ptr

spa(new

ca);

std::shared_ptr

spb(new

cb);

spb->register(spa);

spa->register(spb);

printf(

"%d\n

", spb.use_count()); //

1 printf("

%d\n

", spa.use_count()); //

2

另乙個迴圈依賴的例子,來自

class person : public enable_shared_from_this

~person()

string getname() const

void setfather(shared_ptrf)

}void setmother(shared_ptrm)

}shared_ptr

getkid(size_t idx)

}return

nullptr;

}private

:

string

m_name;

shared_ptr

m_father;

shared_ptr

m_mother;

//vector> m_kids;

//迴圈依賴

vector>m_kids;

};//

測試**

shared_ptrjack ;

shared_ptr

lucy ;

shared_ptr

john ;

john->setfather(jack);

john->setmother(lucy);

auto p = jack->getkid(0

);

if(p)

vc中的原始碼實現

template

class

weak_ptr

: public _ptr_base<_ty>

template

weak_ptr(

const shared_ptr<_ty2>&_other,

typename enable_if

::value,

void *>::type * = 0

)

weak_ptr(

const weak_ptr&_other)

template

weak_ptr(

const weak_ptr<_ty2>&_other,

typename enable_if

::value,

void *>::type * = 0

)

~weak_ptr()

weak_ptr& operator=(const weak_ptr&_right)

template

weak_ptr& operator=(const weak_ptr<_ty2>&_right)

template

weak_ptr& operator=(shared_ptr<_ty2>&_right)

void

reset()

void swap(weak_ptr&_other)

bool expired() const

shared_ptr

<_ty> lock() const

};

智慧型指標weak ptr

智慧型指標weak ptr主要用來協助shared ptr。不參與引用計數,但是有以下好處 1 打破遞迴的依賴關係 2 使用乙個共享的資源但是不要所有權,不新增引用計數 3 避免懸空指標。使用方法有二 方法一 boost shared ptrsp new std string method1 從sh...

智慧型指標 weak ptr

weak ptr是為了配合shared ptr而引入的一種智慧型指標,它更像是shared ptr的乙個助手而不是智慧型指標,因為它不具有普通指標的行為,沒有過載operator 和 它的最大作用在於協助shared ptr工作,像旁觀者那樣觀測資源的使用情況.用法 weak ptr被設計為與sha...

智慧型指標 weak ptr

weak ptr weak ptr是為了配合shared ptr而引入的一種智慧型指標,它更像是shared ptr的乙個助手而不是智慧型指標,因為它不具有普通指標的行為,沒有過載operator 和 它的最大作用在於協助shared ptr工作,像旁觀者那樣觀測資源的使用情況.用法 weak pt...