赞
踩
c++ primer plus 第16章string 类和标准模板库,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将是唯一的选择。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。