首页电脑使用C++的std::weak_ptr怎么用?和shared_ptr有什么区别? c++ std::shared_ptr

C++的std::weak_ptr怎么用?和shared_ptr有什么区别? c++ std::shared_ptr

圆圆2025-06-10 16:01:37次浏览条评论

std::weak_ptr用于解决循环引用问题。当两个对象互相持有对方的shared_ptr时,会形成循环引用,导致内存无法释放。通过将其中一个引用改为weak_ptr,可打破循环。使用时需通过lock()转换为shared_ptr并检查即可。它不拥有资源,不影响对象周期,适用于存储、观察者模式等场景。

C++的std::weak_ptr怎么用?和shared_ptr有什么区别?

std::weak_ptr是C中智能指针家族的一员,它和std::shared_ptr一起使用,主要用于解决循环引用的问题。它本身并不拥有资源,而是对shared_ptr所管理的对象的一个​​“弱”。意味着它不会增加对象的引用计数,也不会阻止对象被释放。为什么需要weak_ptr?

在使用shared_ptr的时候,如果两个对象互相持有对方的shared_ptr,就很容易造成循环引用,导致内存无法释放。

举个简单的例子:

立即学习“C” 自由学习笔记(研究)”;struct B;struct A { std::shared_ptrlt;Bgt; ptr;};struct B { std::shared_ptrlt;Agt; ptr;};登录后复制

如果创建了两个对象,并使它们互相引用:auto a = std::make_sharedlt;Agt;();auto b = std::make_sharedlt;Bgt;();a-gt;ptr = b;b-gt;ptr = a;登录后复制

这个时候,a 和 b 都有一个统计引用为 2(自身被对方引用),当作用域外后,它们的引用必然减到 1,不会真正释放内存。

这时候就需要weak_ptr 来打破这种循环依赖。weak_ptr 的基本实现

weak_ptr 不能直接访问对象,必须通过 lock()方法转换成shared_ptr

修改上面的例子:struct A;struct B { std::weak_ptrlt;Agt; ptr; //改为weak_ptr};struct A { std::shared_ptrlt;Bgt; ptr;};登录后复制

这样,当a持有b的shared_ptr,而b只是弱引用a,就不会形成循环引用。离开作用域时,引用计数正常归零,对象会被释放。

访问weak_ptr内容时要这样做:std::shared_ptrlt;Agt; temp = b.ptr.lock();if (temp) { // 对象还活着,可以安全使用 temp} else { // 对象已经被释放了}登录后复制shared_ptr和weak_ptr的区别特性shared_ptrweak_ptr是否拥有资源✅是❌ 否会增加引用计数吗✅ 会❌ 无法实现直接访问对象可以❌必须转成shared_ptr影响对象生命周期✅影响❌不影响主要用途共享资源✅监控资源、打破循环引用

简单地说:如果你多个地方共享一个对象的生命周期,是否希望用shared_ptr。

如果只是想观察或者偶尔访问这个对象,不想影响它的生命周期,就用weak_ptr。使用weak_ptr的几个注意事项每次使用前调用lock()并检查是否为空,因为对象可能已经被释放了。不要长期持有lock()返回的shared_ptr,否则可能会延长对象的生命周期,甚至重新引入循环引用的风险。weak_ptr适合用于守护、观察者模式、树结构中的父节点引用等情况。它本身不支持

基本上就这些。掌握好常见的weak_ptr的使用,能有效避免一些的资源管理问题,特别是在复杂的对象文章里。

以上就是C的std::weak_ptr怎么用?和shared_ptr有什么区别?的详细内容,更多请关注乐常识网其他相关!

C++的std::w
关于IIS4的Catalog.wci文件夹的问题 iis iic
相关内容
发表评论

游客 回复需填写必要信息