智能指针之auto_ptr

最近在看STL,看到了auto_ptr,发现这个真的是个好东西,不敢自私,所以写篇博文和大家共享。C++标准程序库提供的auto_ptr是一种智能型的指针(smart pointer)。可以帮助程序员防止一些资源泄漏。

我们都知道在C++中用new开辟的空间是在堆上开辟的。同时,我们还知道用new开辟的空间,必须用delete来释放,必须手动释放。其实就这个动态开辟内存空间,然后又手动释放,这个很纠结的事情就带来了很多纠结的问题。

现在我打个比方:如果你动态开辟的空间,开辟成功了,然后也写了释放语句。这就是按照套路出发。是的,程序是对的,但是,你有没有想过这样的一个问题。

/* *...... */ int *p = new int[10]; /* *....... */ delete[] p 如此,无可厚非,但是,问题就是出现在new和delete之间了。你可以想想,你成功的在堆上开辟了空间,程序还没有执行到delete语句的时候,程序抛出了异常,或者各种蛋疼的错误而退出去了。这个时候,你是不是傻眼了,是的,这个问题的确很难解决。既然有了问题,那么肯定又解决问题的方法了,出现异常了,那么我们就可以捕捉异常。如下: /* *...... */ ClassB *b = new ClassB(); try { ... } catch (...) //for any exception { delete b; throw; } delete b; //clean up on normal /* *...... */ 如此,捕捉各种异常,然后在异常中删除开辟的空间。貌似很完美,是的,程序的冗余度将大大的增加,同时程序的易读性也不好。同时,对于一个大的项目来说,这种方法并不可取。

是的,神一样的STL提供了auto_ptr。多么伟大的东西。防止所谓的“内存泄露”,提供了更好的解决方法。我们知道STL讲究的是泛型。同时这也用到了auto_ptr身上,现在我们来看看auto_ptr的力量。

#include <iostream> #include <memory> using namespace std; template <class T> ostream& operator<< (ostream& strm, const auto_ptr<T>& p) { if (p.get() == NULL) { strm<<"NULL"; } else { strm<<*p; } return strm; } int main() { const auto_ptr<int> p(new int(42)); const auto_ptr<int> q(new int(0)); const auto_ptr<int> r; cout<<"after initialization:"<<endl; cout<<"p: "<<p<<endl; cout<<"q: "<<q<<endl; cout<<"r: "<<r<<endl; *q = *p; //*p = -77; cout<<"after assigning values: "<<endl; cout<<"p: "<<p<<endl; cout<<"q: "<<q<<endl; cout<<"r: "<<r<<endl; }
这个是auto_ptr的一个小小的例子(来自:C++标准程序库);我们看到了,我们的确是动态开辟了空间,但是,在程序中,我们是没有发现delete语句的,何也?是的,这就是智能指针。是的,我不能再多讲了,伟大的东西不是一篇博文能讲清楚的。还等什么,你也试一试吧。如果你是刚刚进入IT的,或者即将进入IT的,下面这篇博文也非常适合你。

当程序员,你应该懂的法则

转载于:https://www.cnblogs.com/JPAORM/archive/2011/08/24/2509881.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值