当前位置:   article > 正文

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

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

delete ps;
  • 1

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

void remodel(std::string &str)
{
std::string *ps =new std::string(str);
...
if (weird thing())
	throw exception()istr =*ps;
delete ps;
return;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/853853
推荐阅读
相关标签
  

闽ICP备14008679号