首页 > 后端开发 > C++ > 如何安全地将 `this` 的 `std::shared_ptr` 传递给相关对象?

如何安全地将 `this` 的 `std::shared_ptr` 传递给相关对象?

DDD
发布: 2024-10-28 21:01:30
原创
856 人浏览过

How Can I Safely Pass a `std::shared_ptr` of `this` to a Related Object?

理解“std::shared_ptr of this”困境

在智能指针的使用中,经常会出现这样的场景:两个相关的对象 A 和 B 需要访问彼此。然而,传递 std::shared_ptr 来建立此连接变得具有挑战性。

例如,考虑父类 A,它需要添加一个子对象 B。父类的 addChild 方法理想情况下应该传递一个 std::

但是,直接 child->setParent(this) 尝试会失败,因为 this 指针是右值。为了解决这个问题,C 提供了 std::enable_shared_from_this。

解决方案: std::enable_shared_from_this

std::enable_shared_from_this 是一个类模板,有助于通过 std::shared_ptr 共享对象。通过继承它,您可以访问shared_from_this(),它提供了必要的std::shared_ptr,如修改后的代码所示:

<code class="cpp">class A : public std::enable_shared_from_this<A> {
...
child->setParent(shared_from_this()); // now valid
};</code>
登录后复制

此外,为了防止可能导致内存泄漏的循环依赖,建议对依赖于父级存在的子级使用 std::weak_ptr:

<code class="cpp">std::list<std::weak_ptr<B>> children; // now using weak_ptr</code>
登录后复制

注意事项

需要注意的是 .shared_from_this() 仅应在调用时调用对象由 std::shared_ptr 管理。这意味着它不能在堆栈上创建,并且通常不能在构造函数或析构函数中调用。

以上是如何安全地将 `this` 的 `std::shared_ptr` 传递给相关对象?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板