文章為轉載+彙總
參考: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指針是可以的。
核心的問題,就是:
- 如果采用傳回拷貝,那麼臨時變量會把this析構掉
-
如果采用傳回引用,那麼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();
}