在C++中,对象内部获取自身shared_ptr时应继承enable_shared_from_this并使用shared_from_this(),避免直接new this或构造新shared_ptr,以防引用计数紊乱导致重复释放;需确保对象已被shared_ptr管理,且不在构造或析构函数中调用。

在C++中,当你已经拥有一个被 std::shared_ptr 管理的对象时,如果该对象内部需要获取指向自身的 std::shared_ptr,直接使用
std::shared_ptr<T>(this)
正确的做法是使用 std::enable_shared_from_this 模板类来安全地获取指向自身的 shared_ptr。
要让一个类支持获取自身的 shared_ptr,需要:
std::shared_ptr<T>
#include <memory>
#include <iostream>
class MyClass : public std::enable_shared_from_this<MyClass> {
public:
MyClass() = default;
// 安全地返回指向自身的 shared_ptr
std::shared_ptr<MyClass> get_shared() {
return shared_from_this();
}
void do_something() {
std::cout << "Doing something...\n";
}
};
int main() {
auto ptr = std::make_shared<MyClass>();
auto self_ptr = ptr->get_shared(); // 正确方式
self_ptr->do_something();
return 0;
}
如果在成员函数中写:
立即学习“C++免费学习笔记(深入)”;
std::shared_ptr<MyClass> bad_ptr(new MyClass(*this)); // 错误!
这会创建一个新的对象和新的引用计数,与原来的 shared_ptr 无关。更危险的是:
std::shared_ptr<MyClass> p1(this); // 千万别这么干!
这会让两个独立的 shared_ptr 管理同一块内存,析构时会重复释放。
使用 shared_from_this() 有几个关键点:
MyClass() {
auto p = shared_from_this(); // 未定义行为或抛异常
}
enable_shared_from_this 内部使用一个 std::weak_ptr 来跟踪对象的生命周期,确保引用计数一致。它支持多线程环境下的安全访问(只要不同时修改同一个 weak_ptr)。
支持多重继承,但要确保 shared_ptr 指向的是继承了 enable_shared_from_this 的那个实例。
基本上就这些。只要记住:想在对象内部返回自己的 shared_ptr,就用 enable_shared_from_this,别自己 new this。以上就是C++ enable_shared_from_this 获取this的shared_ptr的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号