weak_ptr通过lock()方法监控对象生命周期,解决循环引用和内存泄漏问题,在缓存、观察者模式、父子结构等场景中实现安全的非拥有性引用,确保对象销毁后访问可控。

C++ weak_ptr
shared_ptr
shared_ptr
weak_ptr
要实现
C++ weak_ptr
weak_ptr
shared_ptr
weak_ptr
shared_ptr
weak_ptr
weak_ptr
shared_ptr
监控的关键在于
weak_ptr::lock()
weak_ptr
lock()
shared_ptr
shared_ptr
lock()
shared_ptr
shared_ptr
shared_ptr
lock()
shared_ptr
lock()
shared_ptr
#include <iostream>
#include <memory>
#include <string>
class MyObject {
public:
    std::string name;
    MyObject(const std::string& n) : name(n) {
        std::cout << "MyObject " << name << " created." << std::endl;
    }
    ~MyObject() {
        std::cout << "MyObject " << name << " destroyed." << std::endl;
    }
    void doSomething() {
        std::cout << "MyObject " << name << " is doing something." << std::endl;
    }
};
void monitor_object(std::weak_ptr<MyObject> weak_obj) {
    if (auto shared_obj = weak_obj.lock()) {
        std::cout << "  [Monitor] Object " << shared_obj->name << " is still alive." << std::endl;
        shared_obj->doSomething();
    } else {
        std::cout << "  [Monitor] Object has been destroyed." << std::endl;
    }
}
int main() {
    std::cout << "--- Phase 1: Object is alive ---" << std::endl;
    std::shared_ptr<MyObject> obj_ptr = std::make_shared<MyObject>("DataA");
    std::weak_ptr<MyObject> weak_obj_ptr = obj_ptr;
    monitor_object(weak_obj_ptr); // 此时对象存活
    std::cout << "\n--- Phase 2: Reset shared_ptr ---" << std::endl;
    obj_ptr.reset(); // 释放shared_ptr,对象被销毁
    monitor_object(weak_obj_ptr); // 此时对象已销毁
    std::cout << "\n--- Phase 3: Another object ---" << std::endl;
    {
        auto another_obj_ptr = std::make_shared<MyObject>("DataB");
        std::weak_ptr<MyObject> another_weak_ptr = another_obj_ptr;
        monitor_object(another_weak_ptr);
    } // another_obj_ptr 在这里离开作用域,对象被销毁
    monitor_object(std::weak_ptr<MyObject>(nullptr)); // 传递一个空的weak_ptr
    return 0;
}这段代码清晰地展示了
weak_ptr
lock()
shared_ptr
lock()
shared_ptr
shared_ptr
lock()
立即学习“C++免费学习笔记(深入)”;
weak_ptr
说白了,
weak_ptr
shared_ptr
shared_ptr
shared_ptr
shared_ptr
在这种情况下,即使外部已经没有任何
shared_ptr
shared_ptr
shared_ptr
weak_ptr
shared_ptr
weak_ptr
shared_ptr
weak_ptr
shared_ptr
shared_ptr
weak_ptr
weak_ptr
weak_ptr
首先,缓存系统。想象一个图片缓存或者数据缓存,它存储了大量可能被程序其他部分使用的对象。如果缓存直接持有这些对象的
shared_ptr
shared_ptr
weak_ptr
shared_ptr
weak_ptr::lock()
其次,观察者模式或事件系统。在UI编程或事件驱动架构中,一个“主题”(Subject)可能需要通知多个“观察者”(Observer)某个事件发生了。如果主题直接持有观察者的
shared_ptr
weak_ptr
weak_ptr::lock()
再者,父子或层级结构。例如,在游戏引擎的场景图或UI控件树中,父节点通常会拥有子节点的
shared_ptr
shared_ptr
weak_ptr
weak_ptr
最后,资源管理器。有时我们会有一些昂贵的资源(如数据库连接、网络套接字),它们可能被多个模块共享。一个中央的资源管理器可能持有这些资源的
shared_ptr
weak_ptr
weak_ptr
这些场景都突出了一点:
weak_ptr
weak_ptr
shared_ptr
weak_ptr
shared_ptr
lock()
首先,weak_ptr
weak_ptr
shared_ptr
weak_ptr
std::shared_ptr<MyObject> s_ptr = std::make_shared<MyObject>("Initial");
std::weak_ptr<MyObject> w_ptr1 = s_ptr; // 从shared_ptr创建
std::weak_ptr<MyObject> w_ptr2 = w_ptr1; // 从另一个weak_ptr创建需要注意的是,
weak_ptr
unique_ptr
shared_ptr
其次,从weak_ptr
shared_ptr
weak_ptr
weak_ptr
weak_ptr
shared_ptr
lock()
std::weak_ptr<MyObject> weak_obj_ptr = ...; // 假设已经有一个weak_ptr
if (auto shared_obj = weak_obj_ptr.lock()) {
    // 如果lock()成功,shared_obj现在是一个有效的shared_ptr
    // 并且在此作用域内,它会增加对象的引用计数,确保对象不会被销毁
    shared_obj->doSomething();
    std::cout << "Successfully locked and accessed object: " << shared_obj->name << std::endl;
} else {
    // lock()返回空,说明对象已经被销毁
    std::cout << "Failed to lock: object has been destroyed." << std::endl;
}这里
lock()
shared_ptr
shared_ptr
shared_ptr
lock()
shared_ptr
weak_ptr
再次,expired()
weak_ptr
expired()
if (weak_obj_ptr.expired()) {
    std::cout << "Object is already expired." << std::endl;
} else {
    std::cout << "Object is not expired yet." << std::endl;
}然而,
expired()
expired()
false
lock()
lock()
expired()
lock()
shared_ptr
最后,
weak_ptr
shared_ptr
shared_ptr
weak_ptr
以上就是C++weak_ptr实现对象生命周期监控的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号