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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++11新特性之十:enable_shared_from_this

發(fā)布時(shí)間:2025/3/15 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++11新特性之十:enable_shared_from_this 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

??enable_shared_from_this是一個(gè)模板類(lèi),定義于頭文件<memory>,其原型為:

?

template< class T > class enable_shared_from_this;


???????std::enable_shared_from_this 能讓一個(gè)對(duì)象(假設(shè)其名為 t ,且已被一個(gè) std::shared_ptr 對(duì)象 pt 管理)安全地生成其他額外的 std::shared_ptr 實(shí)例(假設(shè)名為 pt1, pt2, ... ) ,它們與 pt 共享對(duì)象 t 的所有權(quán)。
???????若一個(gè)類(lèi) T 繼承 std::enable_shared_from_this<T> ,則會(huì)為該類(lèi) T 提供成員函數(shù): shared_from_this 。 當(dāng) T 類(lèi)型對(duì)象 t 被一個(gè)為名為 pt 的 std::shared_ptr<T> 類(lèi)對(duì)象管理時(shí),調(diào)用 T::shared_from_this 成員函數(shù),將會(huì)返回一個(gè)新的 std::shared_ptr<T> 對(duì)象,它與 pt 共享 t 的所有權(quán)。

一.使用場(chǎng)合

???????當(dāng)類(lèi)A被share_ptr管理,且在類(lèi)A的成員函數(shù)里需要把當(dāng)前類(lèi)對(duì)象作為參數(shù)傳給其他函數(shù)時(shí),就需要傳遞一個(gè)指向自身的share_ptr。

1.為何不直接傳遞this指針

???????使用智能指針的初衷就是為了方便資源管理,如果在某些地方使用智能指針,某些地方使用原始指針,很容易破壞智能指針的語(yǔ)義,從而產(chǎn)生各種錯(cuò)誤。

2.可以直接傳遞share_ptr<this>么?

???????答案是不能,因?yàn)檫@樣會(huì)造成2個(gè)非共享的share_ptr指向同一個(gè)對(duì)象,未增加引用計(jì)數(shù)導(dǎo)對(duì)象被析構(gòu)兩次。例如:

?

#include <memory> #include <iostream>class Bad { public:std::shared_ptr<Bad> getptr() {return std::shared_ptr<Bad>(this);}~Bad() { std::cout << "Bad::~Bad() called" << std::endl; } };int main() {// 錯(cuò)誤的示例,每個(gè)shared_ptr都認(rèn)為自己是對(duì)象僅有的所有者std::shared_ptr<Bad> bp1(new Bad());std::shared_ptr<Bad> bp2 = bp1->getptr();// 打印bp1和bp2的引用計(jì)數(shù)std::cout << "bp1.use_count() = " << bp1.use_count() << std::endl;std::cout << "bp2.use_count() = " << bp2.use_count() << std::endl; } ?// Bad 對(duì)象將會(huì)被刪除兩次


輸出結(jié)果如下:

當(dāng)然,一個(gè)對(duì)象被刪除兩次會(huì)導(dǎo)致崩潰。

正確的實(shí)現(xiàn)如下:

?

#include <memory> #include <iostream>struct Good : std::enable_shared_from_this<Good> // 注意:繼承 { public:std::shared_ptr<Good> getptr() {return shared_from_this();}~Good() { std::cout << "Good::~Good() called" << std::endl; } };int main() {// 大括號(hào)用于限制作用域,這樣智能指針就能在system("pause")之前析構(gòu){std::shared_ptr<Good> gp1(new Good());std::shared_ptr<Good> gp2 = gp1->getptr();// 打印gp1和gp2的引用計(jì)數(shù)std::cout << "gp1.use_count() = " << gp1.use_count() << std::endl;std::cout << "gp2.use_count() = " << gp2.use_count() << std::endl;}system("pause"); }?


輸出結(jié)果如下:


二.為何會(huì)出現(xiàn)這種使用場(chǎng)合

???????因?yàn)樵诋惒秸{(diào)用中,存在一個(gè)保活機(jī)制,異步函數(shù)執(zhí)行的時(shí)間點(diǎn)我們是無(wú)法確定的,然而異步函數(shù)可能會(huì)使用到異步調(diào)用之前就存在的變量。為了保證該變量在異步函數(shù)執(zhí)期間一直有效,我們可以傳遞一個(gè)指向自身的share_ptr給異步函數(shù),這樣在異步函數(shù)執(zhí)行期間share_ptr所管理的對(duì)象就不會(huì)析構(gòu),所使用的變量也會(huì)一直有效了(保活)。

?

---------------------?
作者:燦哥哥?
來(lái)源:CSDN?
原文:https://blog.csdn.net/caoshangpa/article/details/79392878?
?

總結(jié)

以上是生活随笔為你收集整理的C++11新特性之十:enable_shared_from_this的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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