Jan 8

用auto_ptr解决内存泄露的问题 不指定

felix021 @ 2009-1-8 01:13 [IT » 程序设计] 评论(1) , 引用(0) , 阅读(6559) | Via 本站原创 | |
昨天看的《C++标准函数库》,看到auto_ptr这一节,说到了关于内存泄露的问题
而且有些情况以前根本没有考虑到,想想觉得好危险。
典型的情况就是如下的代码:
void foo(){
  int *p = new int[10];
  //do sth.
  delete[] p;
}

如果在//do sth.的时候退出了函数,比如一个return语句,或者是抛出了一个异常
那么最后的delete p就不会被执行,于是就造成了内存的泄露。
更极端一点的情况是,可能申请了多个内存,有多处return,如果每一个都要处理,那程序就太恶心了。
但是不处理又是不行的——于是需要有一种方式来解决,于是标准库就引进了auto_ptr 智能指针。
这个东西保证它自己被销毁的时候能够释放其指向的对象(使用delete)。
一个简单的例子是:
#include<memory>  //auto_ptr在头文件memory里面哦
using namespace std::auto_ptr;  //它在namespace std里面哦

void foo(){
  std::auto_ptr<classA> p(new classA);
  //do sth.
  //no need to free p;
}

在退出函数foo()的时候,p的析构函数会被调用,自动释放它指向的classA,于是再也不用费神去写delete了,真好~

不过auto_ptr不是基于引用计数的智能指针,所以有一些很特殊的属性。
如果想要用它,一定一定要都了解了才用哦!就推荐看这本书《The C++ Standard Library》C++标准函数库。



欢迎扫码关注:




转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: https://www.felix021.com/blog/feed.php
sandy
2009-1-11 19:01
你第一段代码就错了。。(尽管那代码可能是你转载的……)
new 一个数组必须用delete[] 去删除,不能用delete,否则结果是不可预料的……
felix021 回复于 2009-1-11 20:15
哦。。。囧。。。我知道了。
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   *非必须
网址   电邮   [注册]