C++ 浅谈之智能指针 auto_ptr 和 unique_ptr 对比
创始人
2024-05-21 19:25:28
0

C++ 浅谈之智能指针 auto_ptr 和 unique_ptr 对比

HELLO,各位同志好,我是阿呆 🙈🙈🙈

这里是 C++ 浅谈系列,收录在专栏 C++ 语言中 😜😜😜

本系列阿呆将记录一些 C++ 语言重要的语法特性 🏃🏃🏃

OK,兄弟们,废话不多直接开冲 🌞🌞🌞


一 🏠 概述

智能指针是什么:

智能指针是⼀个 RAII 类模型,⽤于动态分配内存,其设计思想是将基本类型指针封装为(模板)类对象指针,并在离开作⽤域时调⽤析构函数,使⽤ delete 删除指针所指向的内存空间 🐌🐌🐌

注:RAII 机制是一种对资源申请、释放操作的封装


智能指针主要作用:

1、内存泄露问题: 对于堆申请内存 (malloc | new),程序员不需再主动释放
2、共享所有权指针释放问题,比如 多线程使用同一个对象时析构问题 🐳🐳🐳


二 🏠 核心

auto_ptr

定义如下,它实现独占式拥有的概念,同⼀时间只能有⼀个智能指针可以指向该对象

template< class T > class auto_ptr;

auto_ptr 在C++11中被摒弃的原因,在查阅资料时发现其众说纷纭 👊👊👊

例 ① 对象所有权的转移,比如在函数传参过程中,对象所有权不会返还,存在潜在内存崩溃问题

//等效 TEST DEMO
auto_ptr a1 = auto_ptr(new string("TEST AUTO PTR"));
auto_ptr a2 = a1;
std::cout << *a1 << std::endl;unique_ptr u1 = unique_ptr(new string("TEST UNIQUE PTR"));
unique_ptr u2 = move(u1);
std::cout << *u1 << std::endl;

很明显对于 auto_ptr 和 unique_ptr 而言,对象所有权都会转移,都存在潜在内存崩溃问题(若调用前未判断空指针) 🐌🐌🐌


例 ② 两个auto_ptr 指针间可以赋值,这就导致指向同一个对象,在delete等操作过程中导致潜在的风险,导致出错

unique_ptr 和 auto_ptr 都是 独占式拥有 概念,auto_ptr 赋值运算符等效于调用 reset(r.release()) ,实际上也是把智能指针 所有权转移,原智能指针被 release 之后已经变成 nullptr,所以不存在 导致指向同一个对象 情况 🐳🐳🐳


因此 auto_ptr 在C++11中被摒弃的原因,除了一些 unique_ptr 的新特性(下文讨论),因为 auto_ptr 实现方式不符合 C++ 严格语法规范(赋值运算符作用于所有权转移


auto_ptr 采用 Copy 语义,期望实现 Move 语义有三大问题 😖😖😖

1、auto_ptr 采用拷贝构造和拷贝赋值构造去实现 Move 语义,若将 auto_ptr 采用值传递作为函数的参数,当函数执行结束时会导致资源被释放,若之后代码再次访问此 auto_ptr 则会是 nullptr

2、由于 auto_ptr 总是使用 non-array delete,所以它不能用于管理 array 类动态内存

3、auto_ptr 不能和 STL 容器和算法配合工作,因为 STL 中的 Copy 真的是 Copy,而不是 Move

所以在 C++ 11 引入了移动(move)概念,使用 unique_ptr 替代了 auto_ptr ,从根本上解决了上述语法规范问题


unique_ptr

对于 unique_ptr ,实现独占式拥有概念,同⼀时间只能有⼀个智能指针可以指向该对象,无法进行拷贝构造和拷贝赋值,但是可以进行移动构造和移动赋值


准库中的实现和《Move constructors 和 Move assignment constructors简介》中的AutoPtr4十分相似,代码如下 👇👇👇👇

template
struct AutoPtr4
{AutoPtr4(T* ptr = nullptr): ptr(ptr){}~AutoPtr4(){if(this->ptr != nullptr){delete this->ptr;this->ptr = nullptr;}}AutoPtr4(const AutoPtr4& ptr4) = delete; // disable copyingAutoPtr4(AutoPtr4&& ptr4) noexcept // move constructor: ptr(ptr4){ptr4.ptr = nullptr;}AutoPtr4& operator=(const AutoPtr4& ptr4) = delete; // disable copy assignmentAutoPtr4& operator=(AutoPtr4&& ptr4) noexcept // move assignment{if(this == &ptr4){return *this;}delete this->ptr;this->ptr = ptr4.ptr;ptr4.ptr = nullptr;return *this;}T& operator*() const{return *this->ptr;}T* operator->() const{return this->ptr;}bool isNull() const{return this->ptr == nullptr;}private:T* ptr;
};

可以看到,unique_ptr禁用了拷贝构造和拷贝赋值构造,仅仅实现了移动构造和移动赋值构造,这也就使得它是独占式的


unique_ptr 新特性 🌸🌸🌸

① unique_ptr指针可放在容器类内使用,auto_ptr不行

vector > a{new int 0, new int 1} ;

② 管理动态数组

unique_ptr p (new int[3]{1,2,3});  
p[0] = 0; // 重载了operator[]

三 🏠 结语

身处于这个浮躁的社会,却有耐心看到这里,你一定是个很厉害的人吧 👍👍👍

如果各位看官大大觉得文章有帮助的话,别忘了点赞 + 关注哦,你们的鼓励就是我最大的动力

博主还会不断更新更优质的内容,加油吧!技术人! 💪💪💪

相关内容

热门资讯

emui 安卓系统对应关系,E... 你有没有发现,每次打开你的华为手机,那个界面看起来是不是特别顺眼?那是因为华为的EMUI系统,它就像...
永诺安卓系统相机,功能解析与使... 你有没有发现,手机拍照已经成为我们生活中不可或缺的一部分?而在这其中,永诺安卓系统的相机功能可是相当...
tinder安卓版系统错误,揭... 最近在使用Tinder安卓版的时候,你是不是也遇到了一些让人头疼的系统错误呢?别急,今天就来和你聊聊...
htc安卓系统怎么更新系统,轻... 亲爱的HTC安卓用户们,你是不是也和我一样,时不时地想给手机来个“大变身”,让它焕然一新呢?没错,今...
安卓最新发布系统,颠覆性更新与... 你知道吗?最近安卓系统又来了一次大变身,这可是科技圈里的大事哦!安卓最新发布的系统,简直就像是一个全...
华为不升级安卓系统,开启自主操... 你知道吗?最近有个大新闻在科技圈里炸开了锅,那就是华为决定不再升级安卓系统!这可不是一个小决定,它背...
安卓保护系统停止运行,紧急排查... 亲爱的手机用户们,你们有没有遇到过这样的情况:手机突然间变得不正常了,安卓保护系统竟然停止运行了?这...
安卓系统记录仪,智能行车安全守... 你有没有想过,开车的时候,那些瞬间发生的事情,就像电影里的精彩片段,一闪而过,却让人回味无穷?别急,...
安卓13系统怎样升级,全面解析... 你有没有发现,你的安卓手机最近是不是有点儿“蔫儿”了?别急,别急,我来告诉你怎么给它来个“大变身”—...
安卓手机进去系统花屏,安卓手机... 手机屏幕突然花屏了,是不是瞬间感觉整个世界都变得不美好了呢?别急,今天就来和你聊聊安卓手机进入系统时...
安卓手机 系统怎么更新,体验最... 亲爱的手机控们,你是不是也和我一样,时不时地想给安卓手机来个“美容”大变身呢?没错,说的就是系统更新...
妈妈手机推荐安卓系统,安卓系统... 亲爱的妈妈们,是不是在为给家里的宝贝挑选一款合适的手机而烦恼呢?别急,今天我就来给你详细介绍一下几款...
oppo安卓版系统设置,全面解... 亲爱的手机控们,你是不是也和我一样,对OPPO安卓版系统的设置充满了好奇?想要让你的OPPO手机更加...
安卓系统是什么cp,CP架构下... 你有没有想过,你的手机里那个默默无闻的安卓系统,其实就像是一个超级贴心的CP(情侣搭档)呢?没错,就...
系统垃圾清理大师 安卓,安卓手... 手机里的垃圾文件是不是让你头疼不已?别急,今天我要给你介绍一位安卓系统里的“清洁小能手”——系统垃圾...
安卓系统分为几层,安卓系统分层... 你知道吗?安卓系统,这个陪伴我们手机生活的“小助手”,其实它内部结构可是相当复杂的呢!今天,就让我带...
系统最像苹果的安卓,揭秘最像苹... 你有没有发现,现在的安卓手机越来越像苹果了?没错,就是那个以简洁设计和流畅体验著称的苹果。今天,就让...
安卓更新13系统游戏,性能升级... 你知道吗?最近安卓系统又来了一次大变身,那就是安卓13系统!这次更新可是带来了不少惊喜,尤其是对那些...
安卓系统开机出错了,安卓系统开... 手机突然开不了机了,这可怎么办?别急,让我来帮你分析一下安卓系统开机出错的那些事儿。一、安卓系统开机...
vovg是安卓系统吗,安卓系统... 你有没有听说过Vovg这个操作系统?最近,这个名词在数码圈里可是引起了不小的热议呢!很多人都在问,V...