Laravel  
laravel
文档
数据库
架构
入门
php技术
    
Laravelphp
laravel / php / java / vue / mysql / linux / python / javascript / html / css / c++ / c#

c++ weak_ptr

作者:故事只剩听说   发布日期:2025-07-18   浏览:17

#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass(int value) : value(value) {
        std::cout << "MyClass constructor called, value: " << value << std::endl;
    }
    ~MyClass() {
        std::cout << "MyClass destructor called" << std::endl;
    }
    void printValue() const {
        std::cout << "Value: " << value << std::endl;
    }

private:
    int value;
};

void observe(std::weak_ptr<MyClass> wp) {
    // 检查 weak_ptr 是否已经过期
    if (std::shared_ptr<MyClass> sp = wp.lock()) {
        // 如果没有过期,则可以安全地使用 shared_ptr
        sp->printValue();
    } else {
        std::cout << "No longer exists." << std::endl;
    }
}

int main() {
    {
        std::shared_ptr<MyClass> sp(new MyClass(42));
        std::weak_ptr<MyClass> wp = sp;

        observe(wp);  // 输出: Value: 42

        sp.reset();  // 释放 shared_ptr,对象将被销毁
        observe(wp);  // 输出: No longer exists.
    }

    return 0;
}

解释说明:

  1. std::weak_ptr 是一个智能指针,它不增加引用计数,因此不会阻止对象的销毁。它可以用来避免循环引用问题。
  2. wp.lock():尝试将 weak_ptr 转换为 shared_ptr。如果对象仍然存在,则返回一个有效的 shared_ptr;如果对象已经被销毁,则返回一个空的 shared_ptr
  3. observe 函数:演示了如何使用 weak_ptr 来安全地访问对象。如果对象还存在,则调用其方法;否则输出提示信息。
  4. sp.reset():释放 shared_ptr 的所有权,导致对象被销毁(如果这是最后一个 shared_ptr)。

这个例子展示了如何使用 weak_ptr 来避免悬挂指针(dangling pointer)问题,并确保在对象不再存在时能够正确处理。

上一篇:c++ 树

下一篇:c++ cli

大家都在看

c++闭包

c++单引号和双引号的区别

c++ 注释

c++如何判断素数

c++ 获取系统时间

c++进制转换函数

c++ tcp

c++ gcd函数

c++ cli

c++ weak_ptr

Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3

Laravel 中文站