#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;
}
std::weak_ptr
是一个智能指针,它不增加引用计数,因此不会阻止对象的销毁。它可以用来避免循环引用问题。wp.lock()
:尝试将 weak_ptr
转换为 shared_ptr
。如果对象仍然存在,则返回一个有效的 shared_ptr
;如果对象已经被销毁,则返回一个空的 shared_ptr
。observe
函数:演示了如何使用 weak_ptr
来安全地访问对象。如果对象还存在,则调用其方法;否则输出提示信息。sp.reset()
:释放 shared_ptr
的所有权,导致对象被销毁(如果这是最后一个 shared_ptr
)。这个例子展示了如何使用 weak_ptr
来避免悬挂指针(dangling pointer)问题,并确保在对象不再存在时能够正确处理。
上一篇:c++ 树
下一篇:c++ cli
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站