item13: 以对象管理资源

来源:互联网 发布:一战中国劳工知乎 编辑:程序博客网 时间:2024/05/29 13:21

我们关注的问题是,你记得释放分配的内存了吗?

你在适当的时候new出来了,然后你最后又把它delete了,看起来好像很简单,但是除非你真的非常小心翼翼,不然你很难确保new/delete真的有成对使用,也许代码中间抛出异常,也许另一个同事在delete之前偷偷加了一个return,谁知道呢。

所以我的建议是最好有管理对象来管理这些指针,std里面有auto_ptr,你可以这样使用:

void f(){std::auto_ptr<Widget> w(createWidget());...}

很好,当离开函数f时,w会被自动销毁。但是w有个不那么招人喜欢的特性(或者说是缺点?),当它被复制时,自己会变成null,而新复制对象将对存来的资源将取得唯一的拥有权,这种行为显然很难让人接受,毕竟没有什么资源会觉得这是正常的,STL的所有容器也允许多个指针指向它。

所以我们引入另一个计数型智能指针tr1::shared_ptr,如同它的名字所暗示的一样,除非所有管理它的指针都被销毁,否则指针所指的资源都不会被销毁!

问题解决。但是我得提醒你另一个容易让你感到伤害的地方,auto_ptr和shared_ptr的析构函数内部都是执行delete操作而不是delete[]操作,这意味着如果你试图分配一块数组给它,几乎可以肯定你一定会陷入某种错误的漩涡。以下行为是典型的错误:

std::auto_ptr<std::string> aps(new std::string[10]);std::tr1::shared_ptr<int> spi(new int[1024]);

事实上C++标准库里并没有特别针对动态分配内存数组而设计的东西,除非你把眼光移向Boost,好吧,那里的确有boost::scoped_array和boost::shared_array,了解一下,如果你真的需要它们。

0 0
原创粉丝点击