在std::shared_ptr被引入之前,C++標(biāo)準(zhǔn)庫中實(shí)現(xiàn)的用于管理資源的智能指針只有std::auto_ptr一個而已,。std::auto_ptr的作用非常有限,,因?yàn)樗嬖诒还芾碣Y源的所有權(quán)轉(zhuǎn)移問題。這導(dǎo)致多個std::auto_ptr類型的局部變量不能共享同一個資源,,這個問題是非常嚴(yán)重的哦,。因?yàn)椋覀€人覺得,,智能指針內(nèi)存管理要解決的根本問題是:一個堆對象(或則資源,,比如文件句柄)在被多個對象引用的情況下,何時(shí)釋放資源的問題,。何時(shí)釋放很簡單,,就是在最后一個引用它的對象被釋放的時(shí)候釋放它,。關(guān)鍵的問題在于無法確定哪個引用它的對象是被最后釋放的。std::shared_ptr確定最后一個引用它的對象何時(shí)被釋放的基本想法是:對被管理的資源進(jìn)行引用計(jì)數(shù),,當(dāng)一個shared_ptr對象要共享這個資源的時(shí)候,,該資源的引用計(jì)數(shù)加1,當(dāng)這個對象生命期結(jié)束的時(shí)候,,再把該引用技術(shù)減少1,。這樣當(dāng)最后一個引用它的對象被釋放的時(shí)候,資源的引用計(jì)數(shù)減少到0,,此時(shí)釋放該資源,。下邊是一個shared_ptr的用法例子:
解決std::shared_ptr循環(huán)引用問題的鑰匙在weak_ptr手上,。weak_ptr對象引用資源時(shí)不會增加引用計(jì)數(shù),但是它能夠通過lock()方法來判斷它所管理的資源是否被釋放,。另外很自然地一個問題是:既然weak_ptr不增加資源的引用計(jì)數(shù),,那么在使用weak_ptr對象的時(shí)候,資源被突然釋放了怎么辦呢,?呵呵,答案是你根本不能直接通過weak_ptr來訪問資源,。那么如何通過weak_ptr來間接訪問資源呢,?答案是:在需要訪問資源的時(shí)候weak_ptr為你生成一個shared_ptr,shared_ptr能夠保證在shared_ptr沒有被釋放之前,,其所管理的資源是不會被釋放的,。創(chuàng)建shared_ptr的方法就是lock()方法。 細(xì)節(jié):shared_ptr實(shí)現(xiàn)了operator bool() const方法來判斷一個管理的資源是否被釋放,。 |
|