天天看點

對于enable_shared_from_this、shared_from_this使用筆記

文章為轉載+彙總

參考:​​​C++11标準庫的一個工具類enable_shared_from_this的作用及原理分析​​​ 從這篇文章中可以知道:

當一個類public繼承enable_shared_from_this時,會獲得一個共有方法shared_from_this:

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

這個東西的引入是為了解決下面的這個問題:

某個類的對象記憶體的生命周期由智能指針來管理,此時要在一個類的成員函數中,對外部傳回shared_ptr構造的this指針會有問題。注意這裡傳回原生的this指針是可以的。

核心的問題,就是:

  1. 如果采用傳回拷貝,那麼臨時變量會把this析構掉
  2. 如果采用傳回引用,那麼obj對象本身必須持有一個管理他的shared_ptr,這樣會導緻obj永遠不會被釋放

    可用的解決方案有以下兩種

void getSharedFromParam(shared_ptr<obj>& p) {
        p.reset(this);    // 通過函數參數來實作規避掉拷貝語義,但是這樣太過于醜陋
    }

    shared_ptr<obj> getSharedFromThis() {
        return shared_from_this();  // 這是C++11推薦的方法,可以實作安全的傳回一個shared_ptr<this>,傳回到外面的shared_ptr的拷貝的use_count是1,不用擔心this被意外delete和引用計數異常的問題。
    }      
int main() {
    auto p =std::make_shared<obj>();
    // auto p = new obj();
    p->getSharedFromThis()->doSomething();
}      

繼續閱讀