weak_ptr通过打破shared_ptr循环引用防止内存泄漏,适用于缓存、观察者模式和数据结构场景,使用lock()检查对象有效性,相比原始指针更安全。

C++内存管理中,
weak_ptr
解决方案:
循环引用发生在两个或多个对象互相持有
shared_ptr
weak_ptr
识别循环引用: 首先,你需要识别代码中可能存在循环引用的地方。通常,这涉及到对象之间的互相引用。
立即学习“C++免费学习笔记(深入)”;
使用 weak_ptr
shared_ptr
weak_ptr
使用 lock()
weak_ptr
lock()
lock()
shared_ptr
shared_ptr
shared_ptr
#include <iostream>
#include <memory>
class B; // 前向声明
class A {
public:
std::shared_ptr<B> b_ptr;
~A() { std::cout << "A is destroyed" << std::endl; }
};
class B {
public:
std::weak_ptr<A> a_ptr; // 使用 weak_ptr
~B() { std::cout << "B is destroyed" << std::endl; }
};
int main() {
std::shared_ptr<A> a = std::make_shared<A>();
std::shared_ptr<B> b = std::make_shared<B>();
a->b_ptr = b;
b->a_ptr = a; // B 持有 A 的弱引用
// a 和 b 超出作用域,都会被销毁,避免了内存泄漏
return 0;
}在这个例子中,
B
weak_ptr
A
A
B
weak_ptr
weak_ptr
weak_ptr
shared_ptr
weak_ptr
weak_ptr
如何安全地使用
weak_ptr
安全使用
weak_ptr
lock()
#include <iostream>
#include <memory>
class MyObject {
public:
void doSomething() {
std::cout << "Doing something!" << std::endl;
}
~MyObject() { std::cout << "MyObject destroyed" << std::endl; }
};
int main() {
std::weak_ptr<MyObject> weakObj;
{
std::shared_ptr<MyObject> sharedObj = std::make_shared<MyObject>();
weakObj = sharedObj;
if (auto sharedPtr = weakObj.lock()) {
sharedPtr->doSomething();
} else {
std::cout << "Object is no longer available." << std::endl;
}
} // sharedObj goes out of scope here and MyObject is destroyed
if (auto sharedPtr = weakObj.lock()) {
sharedPtr->doSomething();
} else {
std::cout << "Object is no longer available." << std::endl;
}
return 0;
}如果
lock()
shared_ptr
weak_ptr
weak_ptr
weak_ptr
weak_ptr
weak_ptr
lock()
以上就是C++内存管理基础中weak_ptr避免循环引用的技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号