weak_ptr通过lock()方法安全访问可能失效的对象,返回shared_ptr以临时增加引用计数,确保对象在使用期间不被销毁,若对象已销毁则返回空,从而避免悬空指针。

C++ weak_ptr
shared_ptr
weak_ptr
lock()
shared_ptr
shared_ptr
lock()
shared_ptr
要锁定
weak_ptr
shared_ptr
weak_ptr
lock()
shared_ptr
weak_ptr
shared_ptr
lock()
shared_ptr
shared_ptr
lock()
shared_ptr
nullptr
shared_ptr
weak_ptr
lock()
weak_ptr
#include <iostream>
#include <memory>
#include <vector>
class MyObject {
public:
int id;
MyObject(int i) : id(i) {
std::cout << "MyObject " << id << " created." << std::endl;
}
~MyObject() {
std::cout << "MyObject " << id << " destroyed." << std::endl;
}
void doSomething() {
std::cout << "MyObject " << id << " is doing something." << std::endl;
}
};
int main() {
std::shared_ptr<MyObject> sharedObj = std::make_shared<MyObject>(100);
std::weak_ptr<MyObject> weakObj = sharedObj;
// 尝试锁定 weak_ptr 并获取 shared_ptr
if (auto lockedSharedObj = weakObj.lock()) {
std::cout << "Object is still alive. ID: " << lockedSharedObj->id << std::endl;
lockedSharedObj->doSomething();
} else {
std::cout << "Object has been destroyed." << std::endl;
}
// 让 sharedObj 失效,模拟对象被销毁
sharedObj.reset();
std::cout << "sharedObj has been reset." << std::endl;
// 再次尝试锁定 weak_ptr
if (auto lockedSharedObj = weakObj.lock()) {
std::cout << "Object is still alive. ID: " << lockedSharedObj->id << std::endl;
lockedSharedObj->doSomething();
} else {
std::cout << "Object has been destroyed." << std::endl;
}
// 另一个例子:在作用域结束后
{
std::shared_ptr<MyObject> anotherSharedObj = std::make_shared<MyObject>(200);
std::weak_ptr<MyObject> anotherWeakObj = anotherSharedObj;
if (auto s = anotherWeakObj.lock()) {
std::cout << "Another object is alive. ID: " << s->id << std::endl;
}
} // anotherSharedObj 在这里超出作用域并被销毁
if (auto s = weakObj.lock()) { // weakObj 仍然指向之前的被销毁的对象
std::cout << "This should not happen." << std::endl;
} else {
std::cout << "Another object has been destroyed as well (from weakObj's perspective, still empty)." << std::endl;
}
if (auto s = anotherWeakObj.lock()) { // anotherWeakObj 指向的对象已被销毁
std::cout << "This should not happen either." << std::endl;
} else {
std::cout << "The object pointed to by anotherWeakObj has indeed been destroyed." << std::endl;
}
return 0;
}weak_ptr
在我看来,
weak_ptr
shared_ptr
shared_ptr
weak_ptr
shared_ptr
weak_ptr
shared_ptr
weak_ptr
weak_ptr::lock()
weak_ptr::lock()
shared_ptr
shared_ptr
lock()
lock()
shared_ptr
if (auto locked_ptr = weak_ptr_instance.lock())
立即学习“C++免费学习笔记(深入)”;
// 推荐的用法
if (auto locked_ptr = myWeakPtr.lock()) {
// 安全地使用 locked_ptr
locked_ptr->someMethod();
} else {
// 对象已失效
std::cerr << "Warning: Object no longer exists!" << std::endl;
}
// 不推荐的用法(可能导致解引用空指针)
// auto locked_ptr = myWeakPtr.lock();
// locked_ptr->someMethod(); // 如果 locked_ptr 是空的,这里会崩溃另一个需要注意的细节是,
lock()
lock()
weak_ptr
weak_ptr
shared_ptr
weak_ptr
lock()
weak_ptr
// 简化版观察者模式示例
class Observer {
public:
virtual void onEvent() = 0;
virtual ~Observer() = default;
};
class Subject {
public:
void addObserver(std::shared_ptr<Observer> obs) {
observers_.push_back(obs); // 这里我们为了简化先用shared_ptr,实际通常是weak_ptr
}
void notify() {
// 实际应用中,这里会遍历 weak_ptr 列表,并 lock()
for (auto& obs : observers_) {
// 假设这里是 weak_ptr<Observer>
// if (auto locked_obs = obs.lock()) {
// locked_obs->onEvent();
// }
obs->onEvent(); // 简化,假设 obs 是 shared_ptr
}
}
private:
std::vector<std::shared_ptr<Observer>> observers_; // 实际应为 std::vector<std::weak_ptr<Observer>>
};在缓存管理中,
weak_ptr
shared_ptr
weak_ptr
shared_ptr
lock()
weak_ptr
shared_ptr
总的来说,
weak_ptr
lock()
以上就是C++weak_ptr锁定对象并获取shared_ptr实例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号