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.