智能指针(二)之auto_ptr
发布日期:2021-09-19 03:18:24 浏览次数:1 分类:技术文章

本文共 1691 字,大约阅读时间需要 5 分钟。

智能指针通过对象管理指针,在构造对象时完成资源的分配及初始化,在析构对象时完成资源的清理及汕尾工作。

因此,可以得到一份简洁版的智能指针代码:

template
class AutoPtr{public: //构造函数,完成资源的初始化与分配 AutoPtr(T* ptr = NULL) :_ptr(ptr) {} //析构函数,完成资源的清理及汕尾工作 ~AutoPtr() { if (NULL != _ptr) { delete _ptr; _ptr = NULL; } }private: T* _ptr;};
int main(){	AutoPtr
a1(new int(100)); AutoPtr
a2(new int(200)); AutoPtr
a3(a1); AutoPtr
a4; a4 = a1; system("pause"); return 0;}

a1与a3共同管理一块空间,a2与a4共同管理一块空间,看起来好像没什么问题。但当程序跑起来,出了函数作用域之后就会崩毁

由于没有实现赋值操作符的重载,拷贝构造函数,所以在创建对象时编译器会自动调用默认的拷贝构造和赋值运算符重载。而系统默认的是浅拷贝

a1与a3,a2与a4共同管理同一块空间,一旦出了函数作用域,a3会调用析构函数,delete掉所指向的空间;而当a1调用析构函数时,此时a1所指向的已经是一块非法内存(因为被a3 delete过了),因此当a1再次delete这块空间时,程序就会挂掉。

同样一块空间被delete了两次,所以最终程序会挂掉。

而auto_ptr是怎么解决这个问题的呢——管理权转移

AutoPtr(AutoPtr& a)//拷贝构造	{		//转移管理权		_ptr = a._ptr;		a._ptr = NULL;	}	//赋值运算符重载	AutoPtr &operator=(AutoPtr &a)	{		if (a._ptr != _ptr)		{			AutoPtr tmp(a);			std::swap(_ptr,tmp._ptr);//析构函数去管理tmp		}		return *this;	}
auto_ptr通过转移管理权,来保证在赋值与拷贝时仅管理一份指针,而防止同一块空间释放多次的问题
#include
using namespace std;template
class AutoPtr{public: //构造函数,完成资源的初始化与分配 AutoPtr(T* ptr = NULL) :_ptr(ptr) {} //析构函数,完成资源的清理及汕尾工作 ~AutoPtr() { if (NULL != _ptr) { delete _ptr; _ptr = NULL; } } AutoPtr(AutoPtr& a)//拷贝构造 { //转移管理权 _ptr = a._ptr; a._ptr = NULL; } //赋值运算符重载 AutoPtr &operator=(AutoPtr &a) { if (a._ptr != _ptr) { AutoPtr tmp(a); std::swap(_ptr,tmp._ptr);//析构函数去管理tmp } return *this; }private: T* _ptr;};int main(){ AutoPtr
a1(new int(100)); AutoPtr
a2(new int(200)); AutoPtr
a3(a1); AutoPtr
a4; a4 = a1; system("pause"); return 0;}

转载地址:https://blog.csdn.net/audience_fzn/article/details/78499707 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:智能指针(三)之scoped_ptr
下一篇:深浅拷贝

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月30日 15时00分54秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

电路板上的晶振不工作怎么办? 2021-07-03
看漫画学卷积运算~ 2021-07-03
嵌入式系统已经进入了算力时代~ 2021-07-03
手把手教你在STM32F4上跑freeRTOS! 2021-07-03
全排列递归算法 2021-07-03
2的幂次方表示(递归) 2021-07-03
自制J-Link OB 成本不到10块 2021-07-03
STM32 Hal库SPI中断 2021-07-03
STM32原有的MDK工程下移植到GCC环境 2021-07-03
STM32 UCOS 和 USB读卡器冲突 2021-07-03
STM32 USB DEVICE 复位后 无法识别 2021-07-03
深圳核芯物联全新产品CL-GA25-P2高精度定位基站给市场带来的新机会:手机APP或小程序在后台时是否还能蓝牙AoA定位? 2021-07-03
深圳核芯物联蓝牙AOA生态合能培训技术专题分享:AoA基站角度视频说明-2分钟看懂核芯物联蓝牙AoA定位“三角“定义 2021-07-03
优趣汇通过上市聆讯:业务增长后劲乏力,B2B模式收入接连下滑 2021-07-03
谷数科技在科创板递表:业绩不达标多次被动回购,有股东提前退出 2021-07-03
德信服务通过上市聆讯:母公司依赖症加剧,提前“套现”8000万元 2021-07-03
火花思维赴美递交上市申请:营收越多亏得越多,还有老师不合格 2021-07-03
睿智融科完成上市辅导:无缘科创板后转向创业板,华兴资本押错注 2021-07-03
叮当健康拟赴港IPO:亏损规模持续扩大,叮当快药多次被罚 2019-04-30
突发!Soul上市中止,因不正当竞争行为成被告,遭索赔410万美元 2019-04-30