C++ 記憶體管理::enable_shared_from_this



為了讓 `shared_ptr` 管理的物件獲取另一個指向自身的 `shared_ptr`,我們需要一種方法來獲取其控制塊。這是透過使用 `std::enable_shared_from_this` 函式實現的。

本質上,能夠訪問控制塊的控制代碼(可以是 `shared_ptr` 或 `weak_ptr`)是建立新的 `shared_ptr` 例項的主要來源。如果物件擁有該控制代碼,它可以為自己生成更多的 `shared_ptr`。另一方面,`shared_ptr` 充當強大的引用,並影響被管理物件的壽命。

語法

以下是 C++ Memory::enable_shared_from_this 的語法:

class enable_shared_from_this;

引數

T − 指向類的指標。

示例 1

讓我們看看下面的示例,我們在這裡使用 `enable_shared_from_this`,並且兩個 `shared_ptr` 共享同一個物件。

#include <memory>
#include <iostream>
class Good : public std::enable_shared_from_this<Good>{
   public:
   std::shared_ptr<Good> getptr(){
      return shared_from_this();
   }
};
void check(){
   std::shared_ptr<Good> good0 = std::make_shared<Good>();
   std::shared_ptr<Good> good = good0->getptr();
   std::cout << "good.use_count() = " << good.use_count() << '\n';
}
int main(){
   check();
}

輸出

讓我們編譯並執行上面的程式,這將產生以下結果:

good.use_count() = 2

示例 2

考慮另一種情況,我們將使用 `enable_shared_from_this`,並且每個 `shared_ptr` 都認為自己是物件的唯一所有者。

#include <memory>
#include <iostream>
class Good : public std::enable_shared_from_this<Good>{
   public:
   std::shared_ptr<Good> getptr(){
      return shared_from_this();
   }
};
struct notgood {
   std::shared_ptr<notgood> getptr(){
      return std::shared_ptr<notgood>(this);
   }
   ~notgood(){
      std::cout << "Welcome\n";
   }
};
void Check(){
   std::shared_ptr<notgood> bad0 = std::make_shared<notgood>();
   std::shared_ptr<notgood> bad = bad0->getptr();
   std::cout << "bad0.use_count() = " << bad.use_count() << '\n';
}
int main(){
   Check();
}

輸出

執行上述程式碼後,它將顯示如下輸出:

bad0.use_count() = 1
Welcome
double free or corruption (out)
Aborted (core dumped)

示例 3

在下面的示例中,我們將使 `shared_from_this` 在沒有 `std::shared_ptr` 擁有呼叫者的情況下被呼叫。

#include <memory>
#include <iostream>

class Good : public std::enable_shared_from_this<Good>{
   public:
   std::shared_ptr<Good> getptr(){
      return shared_from_this();
   }
};
void check(){
   try {
      Good not_so_good;
      std::shared_ptr<Good> gp1 = not_so_good.getptr();
   } catch(std::bad_weak_ptr& e) {
      std::cout << e.what() << '\n';
   }
}
int main(){
   check();
}

輸出

程式碼執行後,將生成如下輸出:

bad_weak_ptr
廣告
© . All rights reserved.