C++智能指针

最近看了C++ prime plus第六版的智能指针部分(667页16.2),记录以下笔记。

智能指针的作用

在使用动态内存分配的时候,我们可能会因为忘了释放掉不再使用的内存,导致内存泄漏。

如果指针是一个对象,就可以在对象过期时,让析构函数释放内存,这就是智能指针auto_ptr、unique_ptr、shared_ptr背后的思想。

智能指针可以将基本类型指针封装为类对象指针,并在析构函数里编写delete语句删除指针指向的内存空间。最终在其所指向的对象不再被使用之后,会自动释放与对象相关的资源。

四个智能指针

C++98:auto_ptr
C++11:shared_ptr, weak_ptr, unique_ptr

头文件

智能指针的头文件为memory

使用示例

所有的智能指针类都有一个explicit构造函数,以指针作为参数。比如auto_ptr的类模板原型为:

templet<class T>
class auto_ptr {
   
  explicit auto_ptr(X* p = 0) ; 
  ...
};

可以采用以下两种方法来调用智能指针的构造函数完成初始化:

#include <bits/stdc++.h>
using namespace std;
int main(){
   
	//法1、直接新创建一个指针
	auto_ptr<int> p(new int(2));
	cout<<*p.get();		//get函数返回指针
	//法2、用arr指针来初始化智能指针
	int *arr=new int(2);
	unique_ptr<int> p1(arr);
	cout<<*p1.get();
}

运行结果:22

需要注意不要用非堆内存的指针来进行初始化,会导致错误。

三种智能指针的区别

C++ prime plus介绍了auto_ptr、unique_ptr、shared_ptr三种智能指针的区别。

先看下面代码:

auto_ptr< string> ps (new string ("I reigned lonely as a cloud.”);
auto_ptr<string> vocation; 
vocaticn = ps;

上述赋值语句将完成什么工作呢?如果ps和vocation是常规指针,则两个指针将指向同一个string对象。这是不能接受的,因为程序将试图删除同一个对象两次——一次是ps过期时,另一次是vocation过期时。要避免这种问题,方法有多种:

  • 定义陚值运算符,使之执行深复制。这样两个指针将指向不同的对象,其中的一个对象是另一个对象的副本,缺点是浪费
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值