weak_ptr用于解决shared_ptr的循环引用和悬空指针问题,通过不增加引用计数实现对对象的弱引用,需配合lock()安全访问目标对象。

弱指针(
weak_ptr
weak_ptr
解决方案
使用
weak_ptr
weak_ptr
weak_ptr
创建 weak_ptr
shared_ptr
立即学习“C++免费学习笔记(深入)”;
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<int> sharedPtr = std::make_shared<int>(42);
std::weak_ptr<int> weakPtr = sharedPtr; // 从 shared_ptr 创建 weak_ptr
// ...
}检查有效性: 使用
expired()
lock()
expired()
true
lock()
shared_ptr
shared_ptr
if (!weakPtr.expired()) {
std::shared_ptr<int> sharedPtrFromWeak = weakPtr.lock(); // 尝试获取 shared_ptr
if (sharedPtrFromWeak) {
std::cout << "Value: " << *sharedPtrFromWeak << std::endl; // 安全访问
} else {
std::cout << "Object no longer exists." << std::endl;
}
} else {
std::cout << "Object already expired." << std::endl;
}使用 lock()
shared_ptr
std::shared_ptr<int> sharedPtrFromWeak = weakPtr.lock();
if (sharedPtrFromWeak) {
std::cout << "Value: " << *sharedPtrFromWeak << std::endl;
} else {
std::cout << "Object no longer exists." << std::endl;
}何时应该使用 C++ weak_ptr
weak_ptr
shared_ptr
例如,考虑一个父子关系:
#include <iostream>
#include <memory>
class Child; // 前向声明
class Parent {
public:
std::shared_ptr<Child> child;
~Parent() { std::cout << "Parent destroyed" << std::endl; }
};
class Child {
public:
std::shared_ptr<Parent> parent;
~Child() { std::cout << "Child destroyed" << std::endl; }
};
int main() {
std::shared_ptr<Parent> parent = std::make_shared<Parent>();
std::shared_ptr<Child> child = std::make_shared<Child>();
parent->child = child;
child->parent = parent; // 循环引用
return 0; // Parent 和 Child 都不会被销毁
}在这个例子中,
Parent
Child
shared_ptr
Child
Parent
shared_ptr
Parent
Child
要解决这个问题,可以将
Child
Parent
weak_ptr
#include <iostream>
#include <memory>
class Child;
class Parent {
public:
std::shared_ptr<Child> child;
~Parent() { std::cout << "Parent destroyed" << std::endl; }
};
class Child {
public:
std::weak_ptr<Parent> parent; // 使用 weak_ptr
~Child() { std::cout << "Child destroyed" << std::endl; }
};
int main() {
std::shared_ptr<Parent> parent = std::make_shared<Parent>();
std::shared_ptr<Child> child = std::make_shared<Child>();
parent->child = child;
child->parent = parent;
return 0; // Parent 和 Child 都会被销毁
}现在,
Child
Parent
Parent
Child
weak_ptr
在多线程环境中,
weak_ptr
shared_ptr
lock()
#include <iostream>
#include <memory>
#include <thread>
int main() {
std::shared_ptr<int> sharedPtr = std::make_shared<int>(42);
std::weak_ptr<int> weakPtr = sharedPtr;
std::thread t([weakPtr]() {
std::shared_ptr<int> sharedPtrFromWeak = weakPtr.lock();
if (sharedPtrFromWeak) {
std::cout << "Thread: Value: " << *sharedPtrFromWeak << std::endl;
} else {
std::cout << "Thread: Object no longer exists." << std::endl;
}
});
sharedPtr.reset(); // 主线程释放 shared_ptr
t.join();
return 0;
}在这个例子中,主线程释放了
shared_ptr
weak_ptr
lock()
如何选择 weak_ptr
shared_ptr
选择合适的指针类型取决于你的需求:
shared_ptr
weak_ptr
总之,
weak_ptr
以上就是C++weak_ptr避免悬空指针访问策略的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号