智能指针(二)之auto_ptr
发布日期:2021-09-19 03:18:24
浏览次数:1
分类:技术文章
本文共 1691 字,大约阅读时间需要 5 分钟。
智能指针通过对象管理指针,在构造对象时完成资源的分配及初始化,在析构对象时完成资源的清理及汕尾工作。
因此,可以得到一份简洁版的智能指针代码:
templateclass 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通过转移管理权,来保证在赋值与拷贝时仅管理一份指针,而防止同一块空间释放多次的问题
#includeusing 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.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
优趣汇通过上市聆讯:业务增长后劲乏力,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