一个问题
int func()
{
int * ptr = new int;
...
return 0;
}
问题:忘记了delete,导致堆溢出,怎么办?
答:别忘了delete就行。
然而让程序员”别忘了”总是不安全的。即使没有忘记delete,也会发生一些情况:
int func()
{
int * ptr = new int;
...
try
{
throw ...;
}
...
delete ptr;
return 0;
}
触发异常导致无法delete :O
解决方法:智能指针
智能指针实质为模板类,它可以接受一个指针参数,通常为:new …
有三种智能指针:
1. auto_ptr //被c++11摒弃
2. unique_ptr //c++11新增
3. shared_ptr //c++11新增正因为智能指针是一个类,而一个对象在其过期时会自动调用析构函数
那么, 因为析构函数的存在,所以智能指针则可以不用考虑delete。改进后的代码:
int func()
{
auto_ptr<int> ptr(new int);
...
if(...)
{
throw ...;
}
...
return 0;
}
如果一切正常,return后对象过期,自动调用析构函数
即使触发异常,栈解退时对象过期,同样会调用智能指针的析构函数,