C++智能指针——weak_ptr详解

C++ weak_ptr 详解:从原理到实战,彻底解决shared_ptr循环引用 weak_ptr不是独立的智能指针,而是shared_ptr的“辅助工具”,用于解决循环引用和安全观察对象。2. 核心特性:不拥有对象、不增加强引用计数、需升级为shared_ptr才能访问对象、线程安全的lock()接口。3. 核心场景:解决shared_ptr循环引用、缓存、观察者模式。掌握weak_ptr,能让你在使用shared_ptr时更安全、更灵活,彻底摆脱循环引用导致的内存泄漏问题,写出更健壮的C++代码。最后,留一个小练习:尝试用weak_ptr。 阅读详情

前言
  weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少.  同时weak_ptr 没有重载*和->但可以使用 lock 获得一个可用的 shared_ptr 对象。C++智能指针——share_ptr详解 使用陷阱中提到循环引用导致对象无法被析构的问题,通过weak_ptr可以解决

#ifndef testA_H
#define testA_H

#include <memory>
using namespace std;

class testB;
class testA {
    public:
    testA();
    ~testA();
    void testFunA(const shared_ptr<testB> &sptr);

    private:
    shared_ptr<testB> m_sptrB;
};
#endif

=====================================================================
#include "testA.h"
#include <iostream>
using namespace std;

testA::testA(){}

void testA::testFunA(const shared_ptr<testB> &sptr) {
    cout<<"testFunA"<<endl;
    m_sptrB = sptr;
}
testA::~testA(){
    cout<<"~testA destructor"<<endl;
}

=====================================================================
#ifndef testB_H
#define testB_H

#include <memory>

using namespace std;
class testA;
class testB {
    public:
    testB();
    ~testB();

    void testFunB(const shared_ptr<testA> &sptr);

    private:
    weak_ptr<testA>m_sptrA; //使用weak_ptr替换shared_ptr
};
#endif

=====================================================================
#include "testB.h"
#include <iostream>
using namespace std;

testB::testB(){}

void testB::testFunB(const shared_ptr<testA> &sptr) {
    cout<<"testFunB"<<endl;
    m_sptrA = sptr;
}

testB::~testB(){
    cout<<"~testB destructor"<<endl;
}

=====================================================================

int main(int argc, char const *argv[])
{
    testA *ta = new testA();
    testB *tb = new testB();
    shared_ptr<testA> sptra(ta);
    shared_ptr<testB> sptrb(tb);

    sptra->testFunA(sptrb);
    sptrb->testFunB(sptra);
}

输出结果:

testFunA
testFunA m_sptrB count = 2
testFunB
testFunB m_sptrA count = 1  //在testB类中用weak_ptr不会修改引用计数
~testA destructor
~testB destructor

weak_ptr常用函数介绍:

  • use_count函数,表示当前引用计数
  • reset函数,表示删除当前被管理的对象。
  • expired函数,表示判断被管理的对象是否被删除,相当于use_count()==0,如果被删除则返回true,否则返回false。
    shared_ptr<int> sptr(new int(2));
    weak_ptr<int> wptr(sptr);
    cout<<"wptr count = "<<wptr.use_count()<<endl;  //输出结果:1
    cout<<"wptr expired = "<<wptr.expired()<<endl;  //输出结果:0

    wptr.reset();
    cout<<"wptr count = "<<wptr.use_count()<<endl;  //输出结果:0
    cout<<"wptr expired = "<<wptr.expired()<<endl;  //输出结果:1

lock函数,该函数从资料上解释如下:

Lock and restore weak_ptr

Returns a shared_ptr with the information preserved by the weak_ptr object if it is not expired.

If the weak_ptr object has expired (including if it is empty), the function returns an empty shared_ptr (as if default-constructed).

Because shared_ptr objects count as an owner, this function locks the owned pointer, preventing it from being released (for at least as long as the returned object does not releases it).

This operation is executed atomically.

上述描述理解如下:

如果waak_ptr管理的对象不为空,则返回一个shared_ptr,否则返回一个空的 shared_ptr;此函数锁定所拥有的指针,防止其被释放。

    shared_ptr<int> sp1,sp2;
    weak_ptr<int> wp;
    sp1 = make_shared<int> (20);    // sp1
    wp = sp1;                       // sp1, wp

    cout<<"wp count = "<<wp.use_count()<<endl; count = 1

    sp2 = wp.lock();                // lock返回的是一个shared_ptr,赋值给sp2时引用计数加1

    cout<<"sp2 count = "<<sp2.use_count()<<endl;  count = 2
    cout<<"sp1 count = "<<sp1.use_count()<<endl;  count = 2

    sp1.reset();                    // 重置当前管理的指针,引用计数归零

    cout<<"sp1 count = "<<sp1.use_count()<<endl; count = 0
    cout<<"wp count = "<<wp.use_count()<<endl; count = 1,之前调用了lock防止被释放
    
    sp1 = wp.lock(); //wp.lock放回是shared_ptr,赋值之后引用计数加1 

    cout<<"sp1 count = "<<sp1.use_count()<<endl; count = 2
    cout<<"sp2 count = "<<sp2.use_count()<<endl; count = 2        
  • swap函数,表示交换weak_ptr管理对象和swap参数里边的内容。
    std::shared_ptr<int> sp1 (new int(10));
    std::shared_ptr<int> sp2 (new int(20));

    std::weak_ptr<int> wp1(sp1);
    std::weak_ptr<int> wp2(sp2);

    cout<<"wp1 = "<<*wp1.lock()<<endl;  // 10
    cout<<"wp2 = "<<*wp2.lock()<<endl;  // 20

    wp1.swap(wp2);

    cout<<"wp1 = "<<*wp1.lock()<<endl;  // 20
    cout<<"wp2 = "<<*wp2.lock()<<endl;  // 10

参考:http://www.cplusplus.com/reference/memory/weak_ptr/

C++ 智能指针unique_ptr、shared_ptr、weak_ptr详解(包含代码示例) 阅读详情

相关推荐

C++智能指针详解[shared_ptr、unique_ptr、weak_ptr]]

C++智能指针、shared_ptr、unique_ptr、weak_ptr详解

qq_44237695的博客 1260

C++智能指针weak_ptr详解

一、背景 weak_ptr这个指针天生一副“小弟”的模样,也是在C++11的时候引入的标准库,它的出现完全是为了弥补它老大shared_ptr天生有缺陷的问题,其实相比于上一代的智能指针auto_ptr来说,新进老大shared_ptr可以说近乎完美,但是通过引用计数实现的它,虽然解决了指针独占的问题,但也引来了引用成环的问题,这种问题靠它自己是没办法解决的,所以在C++11的时候将shared_ptr和weak_ptr一起引入了标准库,用来解决循环引用的问题。 二、使用方法 std::weak_pt

sinat_31608641的博客 2万+

【C++11】weak_ptr智能指针使用详解

在C++编程中,处理循环引用是一个常见的问题。循环引用可能导致内存泄漏和资源管理问题。为了解决这个问题,C++11引入了weak_ptr智能指针。弱指针(weak_ptr)是一种不受控制所指向对象生存期的智能指针,它指向由一个shared_ptr管理的对象。允许你共享对象的所有权,但不会增加对象的引用计数。它是一种弱引用,不会阻止对象的销毁。一旦一个指向对象的shared_ptr被销毁,对象就会被释放。即使有weak_ptr指向对象,对象也会被释放。

xiaofeizai1116的博客 1177

weak_ptr

weak_ptr是为了配合shared_ptr而引入的一种智能指针,它指向一个由shared_ptr管理的对象而不影响所指对象的生命周期,即就是将一个weak_ptr绑定到shared_ptr不会改变shared_ptr的引用计数。不论是否有用weak_ptr指向一旦最后一个指向对象的shared_ptr被销毁,对象就会是释放。从这个角度看,weak_ptr更像是一个shared_ptr的助手,weak_ptr并不拥有对对象的管辖权,weak_ptr指向shared_ptr的目标也不会增加计数器值。

m0_57719144的博客 4366

C++11 weak_ptr智能指针详解

weak_ptr这个指针天生一副“小弟”的模样,也是在C++11的时候引入的标准库,它的出现完全是为了弥补它老大shared_ptr天生有缺陷的问题,其实相比于上一代的智能指针auto_ptr来说,新进老大shared_ptr可以说近乎完美,但是通过引用计数实现的它,虽然解决了指针独占的问题,但也引来了引用成环的问题,这种问题靠它自己是没办法解决的,所以在C++11的时候将shared_ptr和weak_ptr一起引入了标准库,用来解决循环引用的问题。weak_ptr本身也是一个模板类,但是不能直接用它来定

二进制君 5276

C++ weak_ptr 使用方法

​介绍了shared_ptr的用法,本篇博客介绍weak_ptr 的用法。

琅嬛福地 404

【C++】weak_ptr弱引用智能指针详解

weak_ptr这个指针天生一副小弟的模样,也是在C++11的时候引入的标准库,它的出现完全是为了弥补它老大shared_ptr天生有缺陷的问题。 相比于上一代的智能指针auto_ptr来说,新进老大shared_ptr可以说近乎完美,但是通过引用计数实现的它,虽然解决了指针独占的问题,但也引来了引用成环的问题,这种问题靠它自己是没办法解决的,所以在C++11的时候将shared_ptr和weak...

Yngz_Miao的博客 3万+

C++11中的智能指针unique_ptr、shared_ptr和weak_ptr详解

详细讲解C++11中引入的智能指针unique_ptr、shared_ptr和weak_ptr。

dvlinker的技术专栏 3万+

C++智能指针:weak_ptr实现详解

weak_ptr描述 声明 头文件:<memory> 模版类:template <class T> class weak_ptr 声明方式:std::weak_ptr<type_id> statement 作用 根据boost库的官方描述,weak_ptr是由shared_ptr管理的一种弱引用对象的模版类。weak_ptr的对象能够使用shared_ptr指针...

天行健,地势坤 1万+

83、C++智能指针:shared_ptr、weak_ptr及相关特性详解

本文详细解析了C++中的智能指针,包括shared_ptr、weak_ptr和unique_ptr的创建、初始化、比较操作、类型转换、删除器获取、I/O操作等核心特性。同时探讨了智能指针在多线程环境中的应用、与标准容器的结合使用以及性能优化策略。文章还提供了智能指针使用注意事项,如避免循环引用、正确使用类型转换和数据竞争的预防方法。通过丰富的代码示例和流程图,帮助开发者更好地理解和运用C++智能指针,提高代码的安全性和可维护性。

rr23456的博客 118

同步辐射材料科学应用指南:从XAFS原位实验到数据处理

材料结构分析是材料研究的核心环节,但传统实验室X射线受限于能量固定、亮度不足,往往难以回答原子局域配位、非晶结构及动态演变等关键问题。同步辐射光源以高通量、连续可调、偏振可控及脉冲时间结构等特性,将材料表征从静态观察推进到原位动态追踪层次。基于X射线吸收精细结构谱(XAFS)、原位实验、X射线衍射与散射、微区成像等技术,研究人员可实现元素选择性分析、近邻原子环境解析及真实工况下的结构演变监测。本文从技术原理出发,覆盖实验方案设计、样品制备、现场对光、数据处理与常见故障排查,并结合典型应用场景,为材料科学领域

weixin_32612263的博客 157

C++ 智能指针详解:从裸指针到 unique_ptr、shared_ptr 与 weak_ptr

今天查漏补缺的时候发现自己居然还没写过关于智能指针的文章,实际上已经用了很久了(笑)。那今天就来简单实现一个基础的智能指针吧。在学习 C++ 的过程中,我们经常会接触到动态内存管理。// 使用 p...delete p;这段代码看起来非常简单。new使用资源。delete但是,真正的问题恰恰出现在这里。如果我们忘记delete会发生什么?内存泄漏。如果delete了两次呢?程序可能直接崩溃。如果函数执行过程中发生异常,导致没有执行到delete呢?依然可能发生内存泄漏。

htw250056的博客 751

MCGSPro动画部件实战:用文本分段实现智能报警提示(附工程文件)

本文详细介绍了在MCGSPro组态软件中,如何利用动画部件的文本分段功能,高效实现触摸屏上的智能报警提示。通过绑定整数变量作为索引,一个部件即可动态切换多种状态信息,解决了传统方法画面臃肿、维护繁琐的痛点。文章提供了从变量定义、部件配置到逻辑联动的完整实战教程,并分享了工程文件复用与性能优化技巧。

weixin_28347369的博客 165

C++智能指针auto_ptr、unique_ptr、shared_ptr、weak_prt详解

C++智能指针auto_ptr、unique_ptr、shared_ptr、weak_prt详解

GodFishhh的博客 2467

FPGA实战:手把手教你用Verilog驱动4.3寸RGB触摸屏(附完整代码)

本文详细介绍了如何使用Verilog语言在FPGA上驱动4.3寸RGB触摸屏,包括时序设计、信号交互原理及完整代码实现。通过双计数器引擎设计和参数化模块,开发者可以高效构建800*480分辨率的显示驱动,并解决工程实践中的信号完整性和时序收敛问题。

rice5的博客 701

南大计算机2024保研笔试:编译原理等5门专业课考点分布与408复习避坑指南

本文详细解析了南京大学计算机2024保研笔试的考点分布与复习策略,重点突出编译原理(占比28%-32%)和离散数学的特色考核。提供跨课程复习方法、真题题型分析及高效备考建议,帮助考生突破传统408框架,应对南大独特的命题风格。

weixin_29304985的博客 342

C++智能指针的使用,auto_ptr,unique_ptr,shared_ptr,weak_ptr详解

C++智能指针的用法,auto_ptr,unique_ptr,shared_ptr,weak_ptr

liu20000505的博客 2312

从ISCXTor2016到CICIDS2017:手把手教你下载和使用UNB的网络安全数据集

本文详细介绍了UNB大学发布的ISCXTor2016和CICIDS2017等网络安全数据集的下载与使用方法,特别适合加密流量识别和网络行为分析研究。文章提供了多种高效获取路径、文件结构解析及实战分析示例,帮助研究者快速上手这些真实场景捕获的精细标注数据集。

weixin_42524945的博客 630

C++智能指针weak_ptr创建和使用详解

是 C++ 标准库中的一个智能指针类,用于解决可能引发的循环引用问题。循环引用可能导致内存泄漏,因为引用计数无法降为零,从而无法释放对象。是一种弱引用,它允许你观测由管理的对象,但不会增加对象的引用计数。换句话说,不拥有所指向对象的所有权,因此不会影响对象的生命周期。当管理的对象被销毁后,对应的会自动失效,指向空值。

m0_74824865的博客 15

ICESat-2数据下载及处理分析随笔

ICESat-2全称是Ice,Cloud and land Elevation Satellite -2。看名字我们能知道它的任务是测ice,cloud和land elevation,而且这是一个Satellite,是一颗卫星。那么这里我们就要分清ICESat-2和ATLAS的关系,ICESat-2是星载平台,是一个space observatory,ATLAS是这个星载平台上搭载的单光子激光雷达系统。

u011322358的博客 1万+

SpringBoot实战教程-springboot概论

Spring Boot 是一个快速开发框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,以及自动配置。内置web容器,帮助开发者能够实现快速开发,简化了应用系统的初始搭建以及开发过程。

鸟哥哥的专栏 4155

C++ 智能指针详解:unique_ptr、shared_ptr 和 weak_ptr 的使用场景

智能指针本质上是一个类,它重载了指针相关的操作符(如*和->),使得其在使用上和普通指针类似,但在内存管理方面有着显著的优势。智能指针利用了 C++ 的 RAII(Resource Acquisition Is Initialization,资源获取即初始化)机制,在对象生命周期结束时自动释放所管理的资源,从而避免了手动释放资源时可能出现的错误。C++ 标准库提供了多种智能指针类型,其中最常用的是unique_ptr、shared_ptr和weak_ptr。

数字魔方操控师的博客 1069

知识图谱中的 Ontology(本体论)

1980年,本体论(Ontology)哲学概念“本体”被引入到人工智能领域用来刻画知识。本体概念模型、明确、形式化、共享。本体是实体存在形式的描述,往往表示为一组概念定义和概念之间的层级关系,本体框架形式树状结构,通常被用来为知识图谱定义schema。如人、公司、车等都可以在具体场景下称为本体。Ontology是(特定领域)信息组织的一种形式,是领域知识规范的抽象和描述,是表达、共享、重用知识的方法。Ontology。

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 2025

C++智能指针3——弱指针weak_ptr详解

共享指针shared_ptr指针存在的一些问题可以有弱指针weak_ptr解决。

xuyouqiang1987的博客 7590

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

掌握C++智能指针:shared_ptr、unique_ptr 和 weak_ptr 详解

它只支持移动语义,不支持拷贝语义,以此确保其唯一性。智能指针通过RAII(资源获取即初始化)机制,能更好地管理堆内存,减少上述问题的发生。C++11中引入了智能指针的概念,以便更好地管理堆内存。通过这些示例和解释,希望你能更清楚地理解和使用 C++ 智能指针,包括。多个智能指针可以共享同一个对象,该对象的生命周期由最后一个引用它的。是一种不控制对象生命周期的智能指针。的所有权只能通过移动语义转移,不支持拷贝。独占其指向的对象,即同一时刻只能有一个。管理的对象,但不会增加其引用计数。

m0_72877724的博客 1535

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++11智能指针(auto_ptr,unique_ptr,shared_ptr,weak_ptr的详解与模拟实现)

概念:RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:不需要显式地释放资源。采用这种方式,对象所需的资源在其生命期内始终保持有效。

yin_ming_hui的博客 1100

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

上一篇: C++智能指针——share_ptr详解
下一篇: 智能指针与句柄详解(二)
OODeveloper
博客等级 码龄12年 43粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值