shared_ptr和 weak_ptr的详细介绍

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

关于 shared_ptr 和 weak_ptr 的详细介绍及使用示例:


1. shared_ptr(共享所有权智能指针)

核心特性
  • 引用计数:记录当前有多少个 shared_ptr 共享同一个对象。
  • 自动释放:当引用计数归零时,自动释放对象内存。
  • 线程安全:引用计数的增减是原子操作(但对象本身的访问需自行同步)。
基本用法
#include <memory>
#include <iostream>

class MyClass {
public:
    MyClass() { std::cout << "MyClass 构造\n"; }
    ~MyClass() { std::cout << "MyClass 析构\n"; }
    void print() { std::cout << "Hello\n"; }
};

int main() {
    // 创建 shared_ptr(推荐使用 make_shared)
    std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();

    // 共享所有权(引用计数+1)
    std::shared_ptr<MyClass> ptr2 = ptr1;

    // 使用 -> 操作符访问成员
    ptr1->print(); // 输出: Hello

    // 引用计数查看(调试用)
    std::cout << "引用计数: " << ptr1.use_count() << std::endl; // 输出: 2

    // ptr1 和 ptr2 离开作用域,引用计数归零,对象自动析构
    return 0;
}
输出结果
MyClass 构造
Hello
引用计数: 2
MyClass 析构

2. weak_ptr(弱引用智能指针)

核心特性
  • 不增加引用计数:仅观察对象,不影响其生命周期。
  • 需转换为 shared_ptr:通过 lock() 获取临时 shared_ptr 来访问对象。
  • 解决循环引用:打破 shared_ptr 的循环依赖,避免内存泄漏。

3. 循环引用问题与 weak_ptr 解决方案

循环引用示例
#include <memory>
#include <iostream>
class Node {
public:
    std::shared_ptr<Node> next;
    Node() { std::cout << "Node 构造\n"; }
    ~Node() { std::cout << "Node 析构\n"; }
};

int main() {
    auto node1 = std::make_shared<Node>();
    auto node2 = std::make_shared<Node>();
    node1->next = node2; // node2 引用计数=2
    node2->next = node1; // node1 引用计数=2

    // 退出作用域后,node1/node2 引用计数=1,无法释放!
    return 0;
}
输出结果(内存泄漏)
Node 构造
Node 构造
使用 weak_ptr 解决循环引用
#include <memory>
#include <iostream>
class SafeNode {
public:
    std::weak_ptr<SafeNode> next; // 使用 weak_ptr
    SafeNode() { std::cout << "SafeNode 构造\n"; }
    ~SafeNode() { std::cout << "SafeNode 析构\n"; }
};

int main() {
    auto node1 = std::make_shared<SafeNode>();
    auto node2 = std::make_shared<SafeNode>();
    node1->next = node2;
    node2->next = node1;

    // 退出作用域后,引用计数归零,正确析构
    return 0;
}
输出结果
SafeNode 构造
SafeNode 构造
SafeNode 析构
SafeNode 析构

4. weak_ptr 的典型使用场景

(1) 访问共享对象前检查存活状态
#include <memory>
#include <iostream>

class MyClass {
public:
    MyClass() { std::cout << "MyClass 构造\n"; }
    ~MyClass() { std::cout << "MyClass 析构\n"; }
    void print() { std::cout << "Hello\n"; }
};

void checkObject(std::weak_ptr<MyClass> weak) {
    if (auto shared = weak.lock()) { // 转换为 shared_ptr
        shared->print();
    } else {
        std::cout << "对象已被释放\n";
    }
}

int main() {
    std::weak_ptr<MyClass> weak;
    {
        auto shared = std::make_shared<MyClass>();
        weak = shared;
        checkObject(weak); // 输出: Hello
    }
    checkObject(weak); // 输出: 对象已被释放
    return 0;
}

输出结果

MyClass 构造
Hello
MyClass 析构
对象已被释放
(2) 观察者模式(缓存)
class DataCache {
    std::weak_ptr<MyClass> cachedData;
public:
    void updateCache(std::shared_ptr<MyClass> data) {
        cachedData = data;
    }
    void useCache() {
        if (auto data = cachedData.lock()) {
            data->print();
        } else {
            std::cout << "缓存无效\n";
        }
    }
};

5. shared_ptr 与 weak_ptr 操作总结

操作shared_ptrweak_ptr
所有权拥有对象所有权仅观察对象
引用计数影响增加不影响
访问对象直接通过 -> 或 *需调用 lock() 获取 shared_ptr
检查有效性if (ptr)if (weak.expired()) 或 lock()

6. 最佳实践

  1. 优先使用 make_shared:更高效(单次内存分配对象+控制块)。
  2. 避免循环引用:成员指针优先考虑 weak_ptr。
  3. 不要用 new 初始化:直接传递裸指针可能导致多次释放。
  4. 谨慎传递 shared_ptr:仅在需要共享所有权时传递,否则传递原始引用或指针。
C++11 新特性 ⑥ | 智能指针 unique_ptr、shared_ptr 和 weak_ptr 详细讲解C++11中的智能指针 unique_ptr、shared_ptr 和 weak_ptr。 阅读详情

相关推荐

VMware 虚拟机里连不上网的五种解决方案

在VMware虚拟机里的虚拟机系统连接不上网络 首先,注意查看适配器选项里的网络连接这两个网络连接是否存在,如果不存在可以重新装一下VM 如果存在,连不上网 解决办法一: 虚拟机设置里,找到“网络适配器”,右边的网络连接选择“NAT 模式”,如果不行的话再linux系统。还是不行的话接着看第二种解决方案。 解决方法二: 可能原因是VMware NET Service...

墨轩 18万+

shared_ptr和weak_ptr

程序中需要管理各种各样的资源,为了避免内存泄露,必须确保在资源再也不需要时释放资源,智能指针提供了这一功能。C++标准提供了两大类智能指针,这里主要介绍shared_ptr。多个shared_ptr可以共享同一个资源,并在最后一个拥有资源的shared_ptr被销毁时释放资源。 1、deleter 2、weak_ptr ...

csdn_cjc的博客 2701

智慧城市项目实战:如何将你的地理数据从城市坐标系(如上海2000)转换到国家CGCS2000?

本文详细介绍了智慧城市项目中地理数据坐标系转换的全流程解决方案,重点讲解如何将城市坐标系(如上海2000)转换到国家CGCS2000。通过七参数布尔莎模型、ArcGIS Pro、QGIS开源方案及Python编程实现,帮助实施团队解决坐标系不统一的技术难题,确保空间分析精度。

weixin_28725949的博客 307

C++ | shared_ptr与weak_ptr

简单介绍shared_ptr与weak_ptr,仿写系统的shared_ptr与weak_ptr,并解决循环引用的问题.shared_ptr是一种智能指针(smart pointer),作用有如同指针,但会记录有多少个shared_ptrs共同指向一个对象。这便是所谓的引用计数(reference counting)。一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除。 weak_ptr是为配合shared_ptr而引入的一种智能指针。 2.Ref_con 3.shar

大柳_的博客。 5238

虚幻UE 增强输入-触发器

输入触发器(UInputTrigger): 使用经过修饰器修改的输入值,或者使用其他输入动作的输出值,来确定是否激活输入动作。

UE成长之路,欢迎大家的关注! 5464

RouterOS网桥VLAN实战:从零构建安全隔离的二层虚拟网络

本文详细讲解了如何在RouterOS上利用网桥和VLAN功能,从零开始构建安全隔离的二层虚拟网络。通过分步实战演示,涵盖核心概念、网桥创建、PVID设置、VLAN规则配置及安全过滤,帮助网络管理员实现办公、访客与服务器网络的逻辑隔离与灵活管理,提升网络安全性。

u9v0w的博客 504

C++11学习之share_ptr和weak_ptr

一、shared_ptr学习1.shared_ptr和weak_ptr 基础概念 shared_ptr与weak_ptr智能指针均是C++ RAII的一种应用,可用于动态资源管理 shared_ptr基于“引用计数”模型实现,多个shared_ptr可指向同一个动态对象,并维护了一个共享的引用计数器,记录了引用同一对象的shared_ptr实例的数量。当最后一个指向动态对象的shared_ptr销毁

脚踏实地,不断突破自我,每天有收获就OK 1万+

从零复刻平衡小车(基于STM32F1)

平衡小车(基于STM32F1)

Legendyyy的博客 5041

C++新特性21_shared_ptr与weak_ptr(大量使用,仅看此篇即可;使用方法;注意事项:不能用同一指针去初始化两个shared_ptr;循环引用问题;weak_pt用于解决循环引用问题)

shared_ptr是带引用计数的智能指针。 1. shared_ptr构造 其初始化多了一种写法:std::make_shared void foo_construct() { int* p = new int(3);//创建int指针 std::shared_ptr<int> sptr(p); std::shared_ptr<int> sptr2(new int(4)); //更建议的初始化方法 std::shared_ptr<int> sptr3 = sp

分享学习成长历程,Winter is coming! 1752

SAP预扣税配置实战:从BP创建到外部接口集成的完整流程

本文详细拆解了SAP S/4HANA中预扣税配置与集成的完整实战流程。内容涵盖从业务伙伴(BP)架构下的数据存储理解、后台基础配置,到针对批量处理场景,如何绕过标准BAPI,采用直接更新核心表LFBW的策略进行高效开发。最后,文章探讨了与外部接口集成的多种模式与数据流设计,为财务顾问和ABAP开发人员提供了一套清晰、可落地的解决方案。

weixin_29204749的博客 415

Linux系统搭建OpenClaw(原Clawdbot)全流程指南 最新版

工具定位:开源个人 AI 助手,支持文件读取、命令执行、多渠道交互(Telegram / 本地终端等);系统要求:主流 Linux 发行版(Ubuntu/Debian/CentOS 等),Node.js ≥22(核心依赖);安全提示:OpenClaw 为测试版,具备高权限操作能力,建议使用非主力机,配置权限白名单,避免接触敏感数据。

AI时代老码农的第二春 6560

shared_ptr和weak_ptr使用介绍

文章目录1 shared_ptr使用介绍1.1 shared_ptr使用介绍1.2 shared_ptr的使用陷阱 1 shared_ptr使用介绍 1.1 shared_ptr使用介绍 熟悉了unique_ptr 后,其实我们发现unique_ptr 这种排他型的内存管理并不能适应所有情况,有很大的局限!如果需要多个指针变量共享怎么办? 如果有一种方式,可以记录引用特定内存对象的智能指针数量,当复制或拷贝时,引用计数加1,当智能指针析构时,引用计数减1,如果计数为零,代表已经没有指针指向这块内存,那么我们

木子皿--啥都不会的菜鸟 1106

群晖Web Station实战:从零搭建个人静态导航站

本文详细介绍了如何利用群晖NAS自带的Web Station套件,从零开始搭建个人静态导航站。通过安装Web Station、上传静态网站源码、配置网页服务与网络门户等步骤,无需代码基础即可实现内网访问。文章还分享了文件权限设置、个性化定制及常见问题排查等实用技巧,帮助用户高效管理个人常用网址,充分挖掘NAS的服务器潜能。

tea88的博客 1330

C++:智能指针-TR1的shared_ptr和weak_ptr使用介绍

shared_ptr: Based on a reference counter model, with the counter incremented each time a new shared pointer object points to the resource, and decremented when the object's destructor executes; when t

_rabbit的专栏 1001

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++智能指针介绍和区别(std::unique_ptr、std::shared_ptr 和 std::weak_ptr)

在 C++ 中,std::unique_ptr、std::shared_ptr 和 std::weak_ptr 是 智能指针(Smart Pointers),它们定义在 <memory> 头文件中,用于自动管理动态分配的内存资源,帮助开发者避免内存泄漏和手动 delete 指针带来的问题。

old_power的博客 539

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++智能指针:TR1的 shared_ptr 和 weak_ptr 使用介绍

(所有示例的运行,将#序号所在main()函数去掉序号即可,参考[url]http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15361/[/url]) get() 返回对象指针 use_count() 返回对象的引用计数 #include #include #include #include /* * shared

ShaderJoy 的兴趣技术杂货铺 1949

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++_智能指针shared_ptr和weak_ptr

智能指针的本质是一个模板类,内部封装了指针变量和一些方法. 智能指针的原理是创建一个模板类对象并将其压入栈中,然后将new申请的堆内存指针(原始指针)"委托"给智能指针,当智能指针超出其作用域要释放时,系统自动调用智能指针的析构函数(内部有释放原始指针的一系列代码),从而将原始指针指向的内存自动释放,不再需要程序员手动释放,极大地减少了内存泄漏和野指针的问题,很nice.

qq_74224788的博客 1924

C++中shared_ptr的实现和weak_ptr的实现

因为unique_ptr没办法实现对一块空间进行多次指向,所以就产生了shared_ptr,这样就表明其实shared_ptr可以多次指向同一块空间,但是它本身又存在一点点内存释放的缺陷,所以就有了waek_ptr和它一起工作。

weixin_74994990的博客 665

C++ unique_ptr、shared_ptr、weak_ptr全面解析

对make出来的智能指针和new出来的智能指针的区别做了详细介绍,同时对shared_ptr和weak_ptr之间的关系做了全面剖析

2401_86112944的博客 1335

C++智能指针总结三——shared_ptr与weak_ptr

C++智能指针总结三——shared_ptr 1.往期回顾2.为什么要使用shared_ptr3.shared_ptr的使用1.shared_ptr原理2.shared_ptr的使用 1.往期回顾 2.为什么要使用shared_ptr 这是因为,无论是auto_ptr还是unique_ptr都是排它型的,即只允许一个智能指针对象引用控制一块动态内存。那如果我们要使用多个指向同一块动态内存的指针时,显然auto_ptr与unique_ptr都不能做到。因此,为了实现多个智能指针引用同一块动态内存的

weixin_45738899的博客 2442

C++11 智能指针:unique_ptr、shared_ptr和weak_ptr 功能特性 模拟实现

C++11 中的智能指针,unique_ptr、shared_ptr和weak_ptr的功能特性、使用场景、辅助函数及模拟实现。

有耐心做好简单事情,坚持写blog 1878

C++智能指针——shared_ptr/weak_ptr

文章目录前言一、shared_ptr介绍1.shared_ptr特点2.原理二、shared_ptr使用1.构造以及简单使用2.常用方法3.错误用法三、weak_ptr介绍1.weak_ptr特点2.使用weak_ptr目的四、weak_ptr的使用1.方法2.使用实例总结 前言 前几天对于智能指针写了个详细介绍,对于unique_ptr的用法也举了很多例子。 针对智能指针的定义和特点,传送门:C++智能指针——unique_ptr 但是由于unique_ptr的局限性:unique_ptr持有对象独有权这

专注音视频底层算法与工程实现,深入解析数字信号处理。深入研究WebRTC 3A、多麦声源定位、vad、语音识别等技术 897

C++为什么要引入weak_ptr智能指针,为什么不直接用shared_ptr

关于这个问题的前提我们都知道, shared_ptr和weak_ptr都是带有引用计数的智能指针,它俩的主要区别就是: shared_ptr可以改变引用计数的值,但是weak_ptr只是资源的观察者不会对资源的引用计数进行加1的操作 但是我们为什么要引入weak_ptr这个智能指针呢? 现在我们看如下的例子中: #include<iostream> using ...

GoingJack博客 1412
上一篇: 软件研发管理者管理团队建议
下一篇: unique_ptr的详细介绍
froxy
博客等级 码龄15年 208粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值