若一个类 T 继承 std::enable_shared_from_this,则会为该类 T 提供成员函数: shared_from_this 。当 T 类型对象 t 被一个为名为 pt 的 std::shared_ptr类对象管理时,调用 T::shared_from_this 成员函数,将会返回一个新的 std::shared_ptr对象,它与 pt 共享 t 的所有权。 使用原因 1.把当前类对...
一、std::enable_shared_from_this的作用 按照enable_shared_from_this - C++ Reference (cplusplus.com)文档介绍:继承std::enable_shared_from_this的子类,可以使用shared_from_this成员函数获取自身的shared_ptr指针;该类提供了允许继承类的对象创建指向自身实例的shared_ptr,并且与存在shared_ptr对象共享所有权。什...
enable_shared_from_this类中使用了一个私有weak_ptr来保存地址,在shared_from_this()通过把这个weak_ptr转换为引用计数为1的shared_ptr返回,避免了临时shared_ptr析构导致this被delete。
再来看看std::enable_shared_from_this的构造函数都是protected,因此不能直接创建std::enable_from_shared_from_this类的实例变量,只能作为基类使用。因此使用方法如下代码所示: #include 《iostream》 #include 《memory》 class Widget : public std::enable_shared_from_this《Widget》{ public: Widget(){ std::...
enable_shared_from_this的使用 class client : public std::enable_shared_from_this<client> { public: ~client() { std::cout << "~client()\n"; } std::shared_ptr<client> get_ptr() { return shared_from_this(); } }; int main() ...
结果也和预期的一致,通过使用std::enable_shared_from_this。两次智能指针的使用增加了共享指针的引用次数。程序退出时也只进行了一次析构。从运行结果来看,使用std::enable_shared_from_this解决了:不能通过原指针增加引用次数的问题。 2、使用enable_shared_from_this需要注意的事 ...
使用情景 :当类对象被 shared_ptr 管理时,需要在类自己定义的函数里把当前类对象作为参数传给其他函数时,这时需要传递一个 shared_ptr ,否则就不能保持 shared_ptr 管理这个类对象的语义( 因为有一个 raw pointer 指向这个类对象,而 shared_ptr 对类对象的这个引用没有计数,很有可能 shared_ptr 已经把类对象资...
std::enable_shared_from_this使用场景 在很多场合,经常会遇到一种情况,如何安全的获取对象的this指针,一般来说我们不建议直接返回this指针,可以想象下有这么一种情况,返回的this指针保存在外部一个局部/全局变量,当对象已经被析构了,但是外部变量并不知道指针指向的对象已经被析构了,如果此时外部使用了这个指针就会发...
如果T继承了enable_shared_from_this,那么该类拥有了shared_from_this()方法,如果obj是使用名为pt的shared_ptr管理的,调用shared_from_this()会返回和pt共享同一个obj的shared_ptr对象,如果obj没有没shared_ptr管理,调用该方法会出错。 使用场景: 创建要给数据对象,该数据对象可以返回迭代器用于迭代它,所以数据对...
1.2 enable_shared_from_this 使用之坑 1.2.1 与构造函数之坑 禁止在构造函数中,使用。这个其实也好理解:对象都没构造完,哪里来的对象让你shared呢 1.2.2 与析构函数之坑 注意,在进入到析构函数之前,shared_ptr的reference count已经是0了,此时不能在访问之前shared_from_this()了 ...