【c++11 之智能指针2 unique、shared、weak *_ptr 原理及案例】及四种智能指针对比分析

C++11引入了智能指针(Smart Pointers)的概念,它们是一种自动管理内存的生命周期的指针类型,帮助开发者避免内存泄漏和野指针等问题。C++11标准库中定义了三种智能指针:std::unique_ptr、std::shared_ptr和std::weak_ptr。

原理

  1. std::unique_ptr:独占所有权模型,同一时间只能有一个unique_ptr指向某个对象,当unique_ptr被销毁(例如离开作用域)时,它所指向的对象也会被自动删除。
  2. std::shared_ptr:共享所有权模型,多个shared_ptr可以指向同一个对象,对象的生命周期会持续到最后一个拥有它的shared_ptr被销毁。当最后一个shared_ptr被销毁时,对象会被自动删除。shared_ptr使用引用计数(reference counting)来实现。
  3. std::weak_ptr:弱引用模型,weak_ptr是对对象的一种弱引用,它不会增加对象的引用计数。它主要用于解决shared_ptr之间的循环引用问题。

使用案例

std::unique_ptr

#include <memory>  class MyClass {  
public:  MyClass() { std::cout << "MyClass created\n"; }  ~MyClass() { std::cout << "MyClass destroyed\n"; }  
};  int main() {  std::unique_ptr<MyClass> ptr(new MyClass()); // 分配并初始化  // 当ptr离开作用域时,MyClass对象会被自动删除  return 0;  
}

std::shared_ptr

#include <memory>  
#include <iostream>  class MyClass {  
public:  MyClass() { std::cout << "MyClass created\n"; }  ~MyClass() { std::cout << "MyClass destroyed\n"; }  
};  int main() {  std::shared_ptr<MyClass> ptr1(new MyClass()); // 分配并初始化  std::shared_ptr<MyClass> ptr2 = ptr1; // ptr2和ptr1共享同一个对象  // 当ptr1和ptr2都离开作用域时,MyClass对象才会被删除  return 0;  
}

std::weak_ptr 解决循环引用

#include <memory>  
#include <iostream>  class A;  
class B;  class A {  
public:  std::shared_ptr<B> b_ptr;  ~A() { std::cout << "A destroyed\n"; }  
};  class B {  
public:  std::weak_ptr<A> a_wptr;  ~B() { std::cout << "B destroyed\n"; }  
};  int main() {  std::shared_ptr<A> a_ptr(new A());  std::shared_ptr<B> b_ptr(new B());  a_ptr->b_ptr = b_ptr;  b_ptr->a_wptr = a_ptr;  // 由于使用了weak_ptr,A和B对象都可以被正确删除  return 0;  
}

注意:在实际使用中,尽量避免裸指针(raw pointers)和new/delete的直接使用,而是尽可能地使用智能指针来管理内存。

总结:

  1. 熟悉C++11引入的三种智能指针的原理及判断使用场景;
  2. 理解unique_ptr对auto_ptr的替换;
  3. 三种指针都是将一些释放操作自动化实现,也可以自己手写智能指针;
  4. 一张表格分辨四种智能指针:
auto_ptr (已废弃)unique_ptrshared_ptrweak_ptr
所有权独有(但有问题的拷贝语义)独有共享(引用计数)不拥有(观察)
拷贝语义转移所有权(可能导致问题)禁止拷贝,但可以移动引用计数增加不支持
赋值语义转移所有权(可能导致问题)禁止赋值,但可以移动赋值引用计数增加不支持
销毁当auto_ptr对象销毁时,原对象也被销毁当unique_ptr对象销毁时,原对象也被销毁当最后一个shared_ptr对象销毁时,原对象被销毁不负责销毁原对象
循环引用不适用不适用可能导致问题(需要weak_ptr解决)用于解决shared_ptr的循环引用问题
安全性低(已废弃)高(但需注意循环引用)高(作为shared_ptr的补充)
个人觉得比较好的资源推荐

点击这里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/32272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

异步开发的终极答案—协程

我们在之前的文章中讲过,在并发场景下,传统的基于多线程的命令式开发模型虽然比较简单,但并发数高了之后资源占用较高,大量线程会阻塞;而响应式编程模式我们可以通过异步化处理提升系统资源的利用效率,但异步开发有违人的直觉,门槛比较高。作为成年人,我们肯定希望全都…

Linux系统及常用命令介绍

一.介绍 Linux一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个遵循POSIX的多用户、多任务、支持多线程和多CPU的操作系统。Linux系统的说明可以自行百度&#xff0c;知道这几点即可&#xff1a; 1.Linux中一切都是文件&#xff1b; 2.Linux是一款免费操作系统&…

【CT】LeetCode手撕—42. 接雨水

目录 题目1- 思路2- 实现⭐42. 接雨水——题解思路 3- ACM实现 题目 原题连接&#xff1a;42. 接雨水 1- 思路 模式识别&#xff1a;求雨水的面积 ——> 不仅是只求一个比当前元素大的元素&#xff0c;还要求面积 单调栈 应用场景&#xff0c;需要找到左边比当前元素大的…

周末总结(2024/06/22)

工作 人际关系核心实践&#xff1a; 要学会随时回应别人的善意&#xff0c;执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己&#xff0c;抬高别人(无阴阳气息) 工作上的要点 现状&#xff08;接受破烂现状&#xff0c;改变状态&#xff09; - 这周没…

java继承Thead类和实现Runnable接口创建线程的区别

一、继承Thread类创建多线程 public class Demo{public static void main(String[] args) {MyThread thread new MyThread();thread.start();}} class MyThread extends Thread{Overridepublic void run() {//子线程执行的操作} }注意&#xff1a;开启子线程要调用start()方法…

Vue82-组件内路由守卫

一、组件内路由守卫的定义 在一个组件里面去写路由守卫&#xff0c;而不是在路由配置文件index.js中去写。 此时&#xff0c;该路由守卫是改组件所独有的&#xff01; 只有通过路由规则进入的方式&#xff0c;才会调这两个函数&#xff0c;否则&#xff0c;若是只是用<Ab…

FastGPT部署

部署脚本 # 数据库的默认账号和密码仅首次运行时设置有效 # 如果修改了账号密码&#xff0c;记得改数据库和项目连接参数&#xff0c;别只改一处~ # 该配置文件只是给快速启动&#xff0c;测试使用。正式使用&#xff0c;记得务必修改账号密码&#xff0c;以及调整合适的知识库…

Vue3图片显示组件,支持多张图片,缩略图,全屏动态加载大图

通过imgs参数传入多张图片&#xff0c;图片路径中包含 /small/ 表示是缩略图&#xff0c;将 /small/ 改为 / 即是该图片的大图。组件首先显示缩略图&#xff0c;然后在mounted事件中js动态加载大图&#xff0c;加载完毕后用大图的内容替换缩略图&#xff0c;实现高清图片的丝滑…

尚品汇-(四)

&#xff08;1&#xff09;商品的基本知识 1.1基本信息—分类 一般情况可以分为两级或者三级。咱们的项目一共分为三级&#xff0c;即一级分类、二级分类、三级分类。 比如&#xff1a;家用电器是一级分类&#xff0c;电视是二级分类&#xff0c;那么超薄电视就是三级分类。…

网页如何发布到服务器上

将网页发布到服务器上的过程涉及多个步骤&#xff0c;包括准备阶段、选择托管提供商、发布网站等。12 准备阶段&#xff1a; 确保在本地开发环境中对网站进行了充分的测试&#xff0c;包括功能测试、性能测试和安全测试。 检查Web.config文件&#xff0c;确保所有的配置设置…

Java中的负载均衡与服务治理

Java中的负载均衡与服务治理 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨Java中的负载均衡与服务治理&#xff0c;这两者在现代分布式系统和微…

Android使用MPAndroidChart 绘制折线图

效果图&#xff1a; 1.导入依赖 1.1在项目根目录下的build.gradle文件中添加代码&#xff08;注意不是app下的build.gradle&#xff09;&#xff1a; maven { url https://jitpack.io } 1.2在app下的build.gradle中的依赖下添加&#xff1a; implementation com.github.PhilJa…

CentOS 7 内核 3.10 升级 6.5.2 (RPM 直装 + 源码编译)

方案一 直接基于 RPM 在线升级&#xff08;简单&#xff0c;速度快&#xff09; rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm -y # &#xff08;选项一&#xff09;升级最新版内…

昇腾Ascend上使用分布式训练

一、环境搭建 1、使用hccn_tool配置昇腾训练卡的芯片网络&#xff0c;包括ip地址和掩码 命令原型 hccn_tool [-i %d] -ip -s [address %s] [netmask %s] 使用样例(配置两张卡)&#xff1a; hccn_tool -i 0 -ip -s address 192.168.2.10 netmask 255.255.255.0 hccn_tool …

IOS Swift 从入门到精通:协议和扩展

文章目录 协议协议继承扩展协议扩展面向协议的编程总结&#xff1a; 今天你将学习一些真正的 Swifty 功能&#xff1a;协议和面向协议的编程&#xff08;POP&#xff09;。 POP 摒弃了庞大而复杂的继承层次结构&#xff0c;代之以更小、更简单、可以组合在一起的协议。这确实应…

Magento1与Magento2的区别

本人接触magento有些年头了。。。 2012年开始用magento 1.7。2016年开始用magento2.0。 截止到目前。M1最新版本是1.9.3.3。 M2最新版本是2.2.2。 想当年第一次接触magento的时候&#xff0c;是跟同事一起&#xff0c;网上下载的Alan Storm的深入理解magento系统&#xff0c;…

【UML用户指南】-20-对基本行为建模-交互图

目录 1、概述 2、顺序图 2.1、两个不同于通信图的特征&#xff1a; 2.1.1、顺序图有对象生命线 2.1.2、顺序图有控制焦点 2.2、结构化控制 2.2.1、可选执行opt 2.2.2、条件执行alt 2.2.3、并行执行par 2.2.4、循环迭代执行loop 2.3、嵌套活动图 3、通信图 3.1、两…

【Python】实用脚本--大疆精灵4rtk照片信息提取

你是否想过&#xff0c;为啥就是拍个照片&#xff0c;为啥会占用几十上百兆&#xff1f; 其实除了照片的像素&#xff0c;照片里还附带了很多其他信息。 这个脚本是之前读取大疆精灵4rtk拍摄的照片信息用的&#xff0c;发出来&#xff0c;按需取用。 #!/usr/bin/env python # …

jnp.matmul和jnp.dot的区别?

jnp.matmul 和 jnp.dot 都是用于矩阵乘法的函数&#xff0c;但它们在处理多维数组&#xff08;即张量&#xff09;时有不同的行为。以下是它们的区别和具体用法&#xff1a; jnp.dot 主要用于向量点积和矩阵乘法。对于一维数组&#xff0c;计算向量的点积。对于二维数组&…

Flutter第十二弹 Flutter多平台运行

目标&#xff1a; 1.在多平台调试启动Flutter程序运行 一、安卓模拟器 1.1 检查当前Flutter适配的版本 flutter doctor提供了Flutter诊断。 $ flutter doctor --verbose /Users/zhouronghua/IDES/flutter/bin/flutter doctor --verbose [✓] Flutter (Channel master, 2.1…