智能指针模板类

本文介绍了智能指针auto_ptr、unique_ptr、shared_ptr的使用和注意事项,强调了unique_ptr在防止内存泄漏和提高安全性方面的优势。通过示例展示了如何避免智能指针使用中的常见问题,并提供了选择合适智能指针的指导原则。
摘要由CSDN通过智能技术生成

一、介绍

智能指针是行为类似于指针的类对象,但对象还有其他功能,下面介绍三个帮助管理动态内存分配的智能指针模板。下面介绍如何实现的:

void remodel(string & str)
{
   
	string * ps= new string (str);
	...
	str=ps;
	return;
	}

有缺陷,调用时,该函数都分配堆中的内存,从不回收,导致内存泄漏。解决方式:在return前添加delete ps释放内存。

有时忘了,但可能在不经意间删除或注释掉了这些代码。即使没忘记,也有可能问题。例:

void remodel(string & str)
{
   
	string * ps = new string (str);
	...
	if(weird_thing())
	throw exception();
	str=*ps;
	delete ps;
	return;
	}

当出现异常,delete将不被执行,因此也将导致内存泄漏。

如何解决呢?

  1. 如何解决呢,当remodel()函数终止,本地变量将从栈内存中删除-因此指针ps占据的内存将被释放,ps指向的内存也被释放,多好。
  2. 若ps指向的内存也被释放,多好。
  3. 若ps有一个析构函数,该析构函数将在ps过期时释放它指向的内存,ps只是个指针,不是析构函数类对象。
  4. 若是对象,则过期时,让它的析构函数删除指向的内存。

这正是auto_ptr,unique_ptr和shared_ptr背后的思想。

二、智能指针auto_ptr、unique_ptr、shared_ptr和make_shared(11)

三个智能指针模板(auto_ptr,unique_ptr和shared_ptr)都定义了类似指针的对象,可以将new获得(直接或间接)的地址赋给这种对象。

当智能指针过期时,其析构函数将使用delete来释放内存,将new返回的地址赋给这些对象,无需机记住稍后释放这些内存:在智能指针过期时,这些内存将被释放。

下图说明auto_ptr和常规指针在行为方面的区别:share_ptr和unique_ptr的行为与auto_ptr相同。
在这里插入图片描述
要创建智能指针对象,必须包含头文件memory,该文件模板定义,然后使用通常的模板语法来实例化所需类型的指针。例如,模板auto_ptr包含下面的构造函数:

template<class x>class auto_ptr{
   
public:
explicit auto_ptr(X*p=0)throw();
...};

throw()意味着构造函数不会引发异常;与auto_ptr一样,throw()也被摒弃。因此,请求X类型的auto_ptr将获得一个指向X类型的auto_ptr:

auto_ptr<double>pd(new double);//pd auto_ptr double;代替double * pd使用

auto_ptr<string>ps(new string);//ps auto_ptr string;代替string * ps使用

new double 是new返回的指针,指向新分配的内存块,它是构造函数auto_ptr<double>的参数,即对应与原型中形参p的实参。同样,new string 也是构造函数的实参,其他两种智能指针使用同样的语法:

unique_ptr<double>pdu(new double);//pdu unique_ptr  double
//通过new构造,涉及到两次内存分配
shared_ptr<string>pss(new string("ffffd"));//pss unique_ptr string
//等于:
//make_shared只分配一次内存,这一块内存里既包括管理对象,也包括数据对象
shared_ptr<string> pss  = make_shared<string>("ffffd");

因此,要转换remodel()函数,应这样做:

  1. 包含头文件memory;
  2. 将指向string的指针替换为指向string的智能指针对象;
  3. 删除delete语句;

下面是使用auto_ptr修改该函数的结果:

#include<memory>
void remodel(string & str)
{
   
	auto_ptr<string>ps(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值