c++ primer plus 第16章string 类和标准模板库,16.2智能指针模板类

c++ primer plus 第16章string 类和标准模板库,16.2智能指针模板类

c++ primer plus 第16章string 类和标准模板库,16.2智能指针模板类


16.2智能指针模板类

智能指针是行为类似于指针的类对象,但这种对象还有其他功能。本节介绍三个可帮助管理动态内存分配的智能指针模板。先来看需要哪些功能以及这些功能是如何实现的。请看下面的函数:

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

您可能发现了其中的缺陷。每当调用时,该函数都分配堆中的内存,但从不收回,从而导致内存泄漏。您可能也知道解决之道–只要别忘了在retur 语句前添加下面的语句,以释放分配的内存即可:

delete ps;

然而,但凡涉及“别忘了”的解决方法,很少是最佳的。因为您有时可能忘了,有时可能记住但可能在不经意间删除或注释掉了这些代码。即使确实没有忘记,也可能有问题。请看下面的变体:

void remodel(std::string &str)
{
std::string *ps =new std::string(str);
...
if (weird thing())
	throw exception()istr =*ps;
delete ps;
return;
}

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

当出现异常时,delete将不被执行,因此也将导致内存泄漏。
可以按第14章介绍的方式修复这种问题,但如果有更灵巧的解决方法就好了。来看一下需要些什么。当remodel()这样的函数终止(不管是正常终止,还是由于出现了异常而终止),本地变量都将从栈内存中删除–因此指针 ps占据的内存将被释放。如果ps指向的内存也被释放,那该有多好啊。如果ps有一个析构函数,该析构函数将在 ps 过期时释放它指向的内存。因此,ps 的问题在于,它只是一个常规指针,不是有析构函数的类对象。如果它是对象,则可以在对象过期时,让它的析构函数删除指向的内存。这正是 auto ptr、unique ptr 和 shared ptr 背后的思想。模板 auto ptr 是C++98提供的解决方案,C++11 已将其摒弃,并提供了另外两种解决方案。然而,虽然 autopt 被摒弃,但它已使用了多年;同时,如果您的编译器不支持其他两种解决方案,autoptr将是唯一的选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值