C++11新特性之十:enable_shared_from_this
??enable_shared_from_this是一個模板類,定義于頭文件<memory>,其原型為:
?
template< class T > class enable_shared_from_this;
???????std::enable_shared_from_this 能讓一個對象(假設其名為 t ,且已被一個 std::shared_ptr 對象 pt 管理)安全地生成其他額外的 std::shared_ptr 實例(假設名為 pt1, pt2, ... ) ,它們與 pt 共享對象 t 的所有權。
???????若一個類 T 繼承 std::enable_shared_from_this<T> ,則會為該類 T 提供成員函數: shared_from_this 。 當 T 類型對象 t 被一個為名為 pt 的 std::shared_ptr<T> 類對象管理時,調用 T::shared_from_this 成員函數,將會返回一個新的 std::shared_ptr<T> 對象,它與 pt 共享 t 的所有權。
一.使用場合
???????當類A被share_ptr管理,且在類A的成員函數里需要把當前類對象作為參數傳給其他函數時,就需要傳遞一個指向自身的share_ptr。
1.為何不直接傳遞this指針
???????使用智能指針的初衷就是為了方便資源管理,如果在某些地方使用智能指針,某些地方使用原始指針,很容易破壞智能指針的語義,從而產生各種錯誤。
2.可以直接傳遞share_ptr<this>么?
???????答案是不能,因為這樣會造成2個非共享的share_ptr指向同一個對象,未增加引用計數導對象被析構兩次。例如:
?
#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() {// 錯誤的示例,每個shared_ptr都認為自己是對象僅有的所有者std::shared_ptr<Bad> bp1(new Bad());std::shared_ptr<Bad> bp2 = bp1->getptr();// 打印bp1和bp2的引用計數std::cout << "bp1.use_count() = " << bp1.use_count() << std::endl;std::cout << "bp2.use_count() = " << bp2.use_count() << std::endl; } ?// Bad 對象將會被刪除兩次
輸出結果如下:
當然,一個對象被刪除兩次會導致崩潰。
正確的實現如下:
?
#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() {// 大括號用于限制作用域,這樣智能指針就能在system("pause")之前析構{std::shared_ptr<Good> gp1(new Good());std::shared_ptr<Good> gp2 = gp1->getptr();// 打印gp1和gp2的引用計數std::cout << "gp1.use_count() = " << gp1.use_count() << std::endl;std::cout << "gp2.use_count() = " << gp2.use_count() << std::endl;}system("pause"); }?
輸出結果如下:
二.為何會出現這種使用場合
???????因為在異步調用中,存在一個保活機制,異步函數執行的時間點我們是無法確定的,然而異步函數可能會使用到異步調用之前就存在的變量。為了保證該變量在異步函數執期間一直有效,我們可以傳遞一個指向自身的share_ptr給異步函數,這樣在異步函數執行期間share_ptr所管理的對象就不會析構,所使用的變量也會一直有效了(保活)。
?
---------------------?
作者:燦哥哥?
來源:CSDN?
原文:https://blog.csdn.net/caoshangpa/article/details/79392878?
?
總結
以上是生活随笔為你收集整理的C++11新特性之十:enable_shared_from_this的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可变大小、颜色边框、样式的UISwitc
- 下一篇: springmvc+mybatis+eh