久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

std::shared_ptr和std::weak_ptr的用法以及引用技術(shù)的循環(huán)引用問題

 win2zhang 2014-10-31

    在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的用法例子:

  1. #include <iostream>  
  2. #include <memory>  
  3.   
  4. class Woman;  
  5. class Man{  
  6. private:  
  7.     std::weak_ptr<Woman> _wife;  
  8.     //std::shared_ptr<Woman> _wife;  
  9. public:  
  10.     void setWife(std::shared_ptr<Woman> woman){  
  11.         _wife = woman;  
  12.     }  
  13.   
  14.     void doSomthing(){  
  15.         if(_wife.lock()){  
  16.         }  
  17.     }  
  18.   
  19.     ~Man(){  
  20.         std::cout << "kill man\n";  
  21.     }  
  22. };  
  23.   
  24. class Woman{  
  25. private:  
  26.     //std::weak_ptr<Man> _husband;  
  27.     std::shared_ptr<Man> _husband;  
  28. public:  
  29.     void setHusband(std::shared_ptr<Man> man){  
  30.         _husband = man;  
  31.     }  
  32.     ~Woman(){  
  33.         std::cout <<"kill woman\n";  
  34.     }  
  35. };  
  36.   
  37.   
  38. int main(int argc, char** argv){  
  39.     std::shared_ptr<Man> m(new Man());  
  40.     std::shared_ptr<Woman> w(new Woman());  
  41.     if(m && w) {  
  42.         m->setWife(w);  
  43.         w->setHusband(m);  
  44.     }  
  45.     return 0;  
  46. }  
    在Man類內(nèi)部會引用一個Woman,Woman類內(nèi)部也引用一個Man,。當(dāng)一個man和一個woman是夫妻的時(shí)候,,他們直接就存在了相互引用問題。man內(nèi)部有個用于管理wife生命期的shared_ptr變量,,也就是說wife必定是在husband去世之后才能去世,。同樣的,woman內(nèi)部也有一個管理husband生命期的shared_ptr變量,,也就是說husband必須在wife去世之后才能去世,。這就是循環(huán)引用存在的問題:husband的生命期由wife的生命期決定,wife的生命期由husband的生命期決定,,最后兩人都死不掉,,違反了自然規(guī)律,導(dǎo)致了內(nèi)存泄漏,。

     解決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方法來判斷一個管理的資源是否被釋放,。


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多