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 在功能上類似於普通指標, 然而乙個比較大的區別是, 弱引用能檢測到所管理的物件是否已經被釋放, 從而避免訪問非法記憶體。
注意: 雖然通過弱引用指標可以有效的解除迴圈引用, 但這種方式必須在程式設計師能預見會出現迴圈引用的情況下才能使用, 也可以是說這個僅僅是一種編譯期的解決方案, 如果程式在執行過程**現了迴圈引用, 還是會造成記憶體洩漏.
classcb;
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中的原始碼實現
templateclass
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...