c++11智能指针

2023-05-16

智能指针的原理
RAII
RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。

在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。 借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:

1. 不需要显式地释放资源。
2. 采用这种方式,对象所需的资源在其生命期内始终保持有效。

并且,智能指针对象重载了*和->运算符,在用法上和原生指针一致。

c++中有三种智能指针:

auto_ptr

头文件:<memory>

auto_ptr使用:

#include <iostream>
#include <memory>
using namespace std;

struct  Date
{
	int year;
	int mouth;
	int day;
};

int main(int argc,char* argv[]) {

	auto_ptr<Date> ap(new Date());
	auto_ptr<Date> ap1(ap);
	ap->year = 2021;
	return  0;
}

执行结果:

 失败的代码是:ap->year = 2021;  为什么此时访问ap的成员时会报错呢?我们来看看它们的地址。

我们发现在拷贝构造之后,sp管理的地址为空,而sp1管理的地址是之前sp所管理的地址,管理权发生了转移。那么上面所说的报错也很容易想通,因为sp管理的地址为空,不能进行访问。

auto_ptr的问题:当对象拷贝或者赋值后,管理权进行转移,造成前面的对象悬空。auto_ptr问题是非常明显的,所以实际中很多公司明确规定了不能使用auto_ptr。
 

 unique_ptr

为了解决拷贝或者赋值时管理权转移的问题,出现了unique_ptr。

unique_ptr解决问题的方式非常粗暴:防拷贝,也就是不让赋值和拷贝

 shared_ptr

shared_ptr是c++11中提出的更,解决了auto_ptr拷贝时所有权转移的问题和unique_ptr不能拷贝和赋值的问题。解决的关键就是增加了引用计数。

shared_ptr的原理:是通过引用计数的方式来实现多个shared_ptr对象之间共享资源。

1.shared_ptr在其内部,给每个资源都维护了着一份计数,用来记录该份资源被几个对象共享。
2. 在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象的引用计数减一。
3. 如果引用计数是0,就说明自己是最后一个使用该资源的对象,必须释放该资源;
4. 如果不是0,就说明除了自己还有其他对象在使用该份资源,不能释放该资源,否则其他对象就成野指针了。
5. shared_ptr中成员函数:use_count(对象数据的引用计数)

 shared_ptr使用

int main(int argc,char* argv[]) {

	shared_ptr<Date> sp(new Date());
	cout << sp.use_count() << endl;   //1

	shared_ptr<Date> sp1(sp);
	cout << sp.use_count() << endl;   //2
	cout << sp1.use_count() << endl;  //2

	return  0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++11智能指针 的相关文章

  • c++11智能指针

    智能指针的原理 RAII RAII xff08 Resource Acquisition Is Initialization xff09 是一种利用对象生命周期来控制程序资源 xff08 如内存 文件句柄 网络连接 互斥量等等 xff09
  • 【C++11】三大神器之——智能指针

    文章目录 前言 一 智能指针的原理1 RAII机制2 简单的实现 二 智能指针的用法1 智能指针的分类2 unique ptr基本语法 3 shared ptr基本语法 4 删除器5 weak ptr 前言 一 智能指针的原理 1 RAII
  • C++ 智能指针 unique_ptr 详解与示例

    unique ptr 是 C 43 43 11 提供的用于防止内存泄漏的智能指针中的一种实现 xff0c 独享被管理对象指针所有权的智能指针 unique ptr对象包装一个原始指针 xff0c 并负责其生命周期 当该对象被销毁时 xff0
  • 智能指针(shared_ptr,unique_ptr)作为函数参数或者返回值时的一些注意事项

    智能指针 shared ptr unique ptr 作为函数参数或者返回值时的一些注意事项 当智能指针作为函数的参数或者返回值时 xff0c 一直在纠结到底是用智能指针对象本身还是用原始指针 Herb Sutter大师的文章很好的解决了这
  • Qt 智能指针详细介绍

    1 Qt智能指针概述 Qt 提供了一套基于父子对象的内存管理机制 所以我们很少需要去手动 delete 但程序中不一定所有类都是QObject的子类 这种情况下仍然需要使用一些智能指针 注意 在 Qt 中使用智能指针时 一定要避免发生多次析
  • C++智能指针 shared_ptr,unique_ptr和weak_ptr

    1 智能指针为什么存在 因为C 没有自动回收内存的机制 因此每一次new出来的动态内存必须手动delete回去 因此智能指针可以解决这个问题 2 智能指针的大致描述是什么 智能指针 自动负责释放所指向的对象 实际上它利用了栈的机制 每一个智
  • 共享型智能指针的实现share_pointer

    智能指针是一个类 它产生的是一个类对象 而不是一个原生的指针对象 但是为了减少类对象与针对对象使用的差异性 所以share ptr类故意重载了两种常见的指针操作符 和 gt 从而share ptr与普通指针使用方式一样 简言之 就是shar
  • C++11之智能指针(unique_ptr、shared_ptr、weak_ptr、auto_ptr)浅谈内存管理

    目录 前言 智能指针 使用方法 unique ptr 实现unique ptr类 使用uniquePtr shared ptr 实现SharedPtr 使用shared ptr weak ptr 使用weak ptr 前言 下面这段代码看起
  • qt 智能指针介绍

    简介 Qt 提供了很多智能指针 比较常见的有 QPointer QSharedDataPointer QSharedPointer QWeakPointer 和 QScopedPointer 描述 QPointer 4 0 已经过时 可以被
  • 【C++11智能指针】unique_ptr概述、初始化、常用操作、返回unique_ptr、指定删除器、尺寸

    文章目录 1 unique ptr概述 2 unique ptr的初始化 2 1 直接初始化 2 2 make unique函数 3 unique ptr不支持拷贝构造和拷贝赋值 4 unique ptr支持移动构造和移动赋值 5 uniq
  • Qt 中的智能指针

    Qt 中的智能指针 上一篇博客中介绍了 C 11 标准中的提供的智能指针 在 Qt 中也提供了类似的替代功能 并且比 C 11 标准中提供的功能还要强大 所以如果我们使用 Qt 作为基础库 那么就没有必要使用C 11 的智能指针 Qt 的智
  • 【Qt】Qt中智能指针

    文章目录 一 QPointer 二 QSharedPointer 2 1 常用操作函数 1 返回此对象所引用的指针的值 2 清除这个QSharedPointer对象 删除它可能对该指针的引用 如果这是最后一个引用 那么指针本身将被删除 3
  • c++11 智能指针 (std::shared_ptr)(一)

    定义于头文件
  • 【C++11智能指针】weak_ptr概述、创建、常用操作、尺寸

    文章目录 1 weak ptr概述 2 weak ptr的创建 2 1 lock 3 weak ptr的常用操作 3 1 use count 3 2 expired 3 3 reset 4 weak ptr的尺寸 1 weak ptr概述
  • 内存的智能管理—智能指针

    前言 我们在使用C和C 进行开发的时候 申请堆区内存是必不可少的 但是很多时候 我们经常忘记释放他导致内存泄漏 从而导致程序崩溃 又或者在尚未使用完成的时候释放 从而导致出现野指针 都是非常危险的现象 所以我们在C 11的标准中提出了智能指
  • 【C++碎碎念】C++11新特性(声明、智能指针、右值引用、lambda表达式)

    目录 一 新类型 二 统一的初始化 三 声明 四 智能指针 五 右值引用 六 Lambda表达式 一 新类型 C 11新增了long long和unsigned long long 以支持64位 或更宽 的整型 新增了类型char16 t
  • C++智能指针详解

    1 概述 我们知道除了静态内存和栈内存外 每个程序还有一个内存池 这部分内存被称为自由空间或者堆 程序用堆来存储动态分配的对象即那些在程序运行时分配的对象 当动态对象不再使用时 我们的代码必须显式的销毁它们 在C 中 动态内存的管理是用一对
  • c++智能指针

    智能指针 智能指针也是模版 在头文件
  • C++智能指针之unique_ptr(保姆级教学)

    目录 unique ptr 概述 涉及程序 初始化 手动初始化 std make unique函数 C 14 unique ptr常规操作 不支持操作 该指针不支持拷贝和赋值操作 所以不能拷贝到容器里 移动语义std move releas
  • 【C++11智能指针】shared_ptr的初始化、拷贝构造和拷贝赋值、移动构造和移动赋值

    文章目录 1 智能指针概述 2 shared ptr的初始化 2 1 shared ptr和new结合使用 直接初始化 2 2 make shared函数 3 shared ptr的拷贝构造和拷贝赋值 4 shared ptr的移动构造和移

随机推荐

  • Golang 计算两个时间相差多少分钟

    stime int64 etime int64 时间戳 starttime 61 time Unix stime 0 endtime 61 time Unix etime 0 costtime 61 decimal NewFromFloat
  • Spring自动配置原理

    文章目录 一 概念二 自动配置原理二 自动配置生效总结 一 概念 spring集成其他框架中 xff0c 需要编写大量的xml配置文件 xff0c 编写这些配置文件十分繁琐 xff0c 常常出行错误 xff0c 导致开发效率低 Spring
  • centos 上容器配置X11

    系统 xff1a centos 7 9 连接工具 xff1a 同一个局域网内win10电脑上安装的MobaXterm Personal 步骤 xff1a 找到对应的包 96 yum whatprovides xhost 安装yum y in
  • Java 实现线程安全的方式

    1 创建线程的三种方式 通过实现 Runnable 接口 xff1b 通过继承 Thread 类本身 xff1b 通过 Callable 和 Future 创建线程 2 线程的生命周期 新建状态 使用 new 关键字和 Thread 类或其
  • 生产者消费者问题c语言_C中的生产者消费者问题

    生产者消费者问题c语言 Here you will learn about producer consumer problem in C 在这里 xff0c 您将了解C语言中的生产者消费者问题 Producer consumer probl
  • 2.15多生产者多消费者问题

    视频链接 xff1a https www bilibili com video BV1YE411D7nH p 61 24 一 xff0c 问题描述 桌上有一只盘子 xff0c 每次只能向其中放入一个水果 爸爸向盘子中只放苹果 xff0c 妈
  • 【已解决】xterm: Xt error: Can‘t open display:

    项目场景 xff1a 在MobaXterm中 xff0c 使用Ubuntu 18 04的gdb来debug MPI并行的C 43 43 代码 问题描述 Debug时 xff0c 输入 mpiexec span class token ope
  • mariadb安装

    1 配置官方的mariadb的yum源 手动创建 mariadb repo仓库文件 touch etc yum repos d mariadb repo 然后写入如下内容 mariadb name 61 MariaDB baseurl 61
  • Java 给某段代码加超时时间

    问题原因 xff1a 使用HuTool 的DbTtil 不能设置数据库连接超时时间 xff0c 可能数据库挂了 xff0c 会导致连接一直卡在那 xff0c 也没有异常抛出 xff0c 导致线程一直占着 所以给该段代码加超时时间处理 spa
  • 使用reserve来避免不必要的内存重新分配

    STL容器的内存分配策略是 xff0c 他们会自动增长以便容纳下你放入其中的数据 xff0c 只要没有超过它的最大限制就可以 xff08 要查看最大限制可调用名为max size的成员函数 xff09 对于vector和string xff
  • zmq发布-订阅模式c++实现

    上一篇讲到zmq的安装及简单的请求 应答模式 xff0c 本篇主要来看一下zmq的pub sub代码如何实现 发布 订阅模式的特点 xff1a 1 一个发布者可以被多个订阅者订阅 xff0c 即发布者和订阅者是1 xff1a n的关系 2
  • git commit之后如何撤销

    git正常提交代码的的操作为 xff1a git add 将本地的所有文件改变添加至暂存区 git commit m 34 fix xx update xx 34 进行commit的提交 git push 推送到远端仓库 如果在git co
  • dockerfile中多个FROM指令的意义(multistage)

    从docker17 05版本开始 xff0c dockerfile中允许使用多个FROM指令 multistage 这是docker17 05版本的release note xff1a https docs docker com engin
  • C++多个头文件中可以定义同名的namespace吗?

    结论 xff1a c 43 43 是支持在多个 h文件中定义同名的namespace的 分两种情况测试 xff1a 1 两个 h文件中namespace名字相同 xff0c 命名空间中成员名称无重复 xff0c 那么他们会合并为一个命名空间
  • k8s pod OOMKilled 错误原因

    k8s oomkilled 错误原因 xff1a 容器使用的内存资源超过了限制 只要节点有足够的内存资源 xff0c 那容器就可以使用超过其申请的内存 xff0c 但是不允许容器使用超过其限制的资源 在yaml文件的resources li
  • 如何在Android上自定义Google窗口小部件

    Google Search is one of the most popular widgets on Android smartphones and tablets It most likely even came preloaded o
  • 解决 OpenCV Error: Insufficient memory (Failed to allocate 3221225472 bytes) in cv::OutOfMemoryError

    现象 xff1a 调用cvLoadImage加载图片时报OpenCV Error Insufficient memory Failed to allocate 3221225472 bytes in cv OutOfMemoryError
  • git:解决git pull/push 每次都要重新输入用户名密码的问题

    使用git pull或者git push默认是每次都要输入用户名密码的 xff0c 使用起来很不方便 xff0c 在Git代码的根目录下执行以下命令实现保存用户名和密码 xff0c 不用每次都输入 xff1a git config glob
  • 解决docker commit报错:invalid reference format: repository name must be lowercase

    现象 xff1a 使用docker commit命令将容器导出为镜像时报错 xff1a invalid reference format repository name must be lowercase docker commit Map
  • c++11智能指针

    智能指针的原理 RAII RAII xff08 Resource Acquisition Is Initialization xff09 是一种利用对象生命周期来控制程序资源 xff08 如内存 文件句柄 网络连接 互斥量等等 xff09