日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对于enable_shared_from_this、shared_from_this使用笔记

發(fā)布時間:2023/12/1 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对于enable_shared_from_this、shared_from_this使用笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章為轉(zhuǎn)載+匯總
參考:C++11標(biāo)準(zhǔn)庫的一個工具類enable_shared_from_this的作用及原理分析
從這篇文章中可以知道:
當(dāng)一個類public繼承enable_shared_from_this時,會獲得一個共有方法shared_from_this:

class T : public enable_shared_from_this<T> { }; shared_ptr<T> shared_from_this();

這個東西的引入是為了解決下面的這個問題:
某個類的對象內(nèi)存的生命周期由智能指針來管理,此時要在一個類的成員函數(shù)中,對外部返回shared_ptr構(gòu)造的this指針會有問題。注意這里返回原生的this指針是可以的。
核心的問題,就是:

  • 如果采用返回拷貝,那么臨時變量會把this析構(gòu)掉
  • 如果采用返回引用,那么obj對象本身必須持有一個管理他的shared_ptr,這樣會導(dǎo)致obj永遠(yuǎn)不會被釋放
    可用的解決方案有以下兩種
void getSharedFromParam(shared_ptr<obj>& p) {p.reset(this); // 通過函數(shù)參數(shù)來實現(xiàn)規(guī)避掉拷貝語義,但是這樣太過于丑陋}shared_ptr<obj> getSharedFromThis() {return shared_from_this(); // 這是C++11推薦的方法,可以實現(xiàn)安全的返回一個shared_ptr<this>,返回到外面的shared_ptr的拷貝的use_count是1,不用擔(dān)心this被意外delete和引用計數(shù)異常的問題。}

注意:當(dāng)你想使用getSharedFromThis時,必須以智能指針構(gòu)造,而非以raw指針形式。否則會報std::bad_weak_ptr的錯

int main() {auto p =std::make_shared<obj>();// auto p = new obj();p->getSharedFromThis()->doSomething(); }

enable_shared_from_this類中使用了一個私有weak_ptr來保存地址,在shared_from_this()通過把這個weak_ptr轉(zhuǎn)換為引用計數(shù)為1的shared_ptr返回,避免了臨時shared_ptr析構(gòu)導(dǎo)致this被delete。

總結(jié)

以上是生活随笔為你收集整理的对于enable_shared_from_this、shared_from_this使用笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。