我们通常在一个函数中申请内存和释放内存时是new,delete
比如
void Test()
{
K* p1(new K);
delete p1;
}
如果我们假如在delete前过早的return了或者函数结束后都没释放p1;这就引发内存泄漏。
而智能指针,就体现在了它的智能上了,它不用我们去delete,它会等待出了这个作用域会自动调用析构函数自动delete调,它里面有三个成员函数,get(),release(),以及reset()。比较常用。(所在文件<memory>)
p1.release(),就是将该指针置为NULL,但会返回没被NULL前时的指针;
p1.reset(new T(1)),重置,析构delete掉p1所指向的之前对象,new一个新的对象T(1),然后重新分配给p1。
p1.get()返回所指向的指针。
例子在下方,可以复制下来运行观察
template<typename T>
void g()
{
// 现在,我们有了一个分配好的对象
T* pt1 = new T;
// 将所有权传给了一个auto_ptr对象
auto_ptr<T> pt2(pt1);
// 使用auto_ptr就像我们以前使用简单指针一样,
*pt2 = 12; // 就像*pt1 = 12
// 用get()来获得指针的值
assert( pt1 == pt2.get() );
// 用release()来撤销所有权
T* pt3 = pt2.release();
// 自己删除这个对象,因为现在没有任何auto_ptr拥有这个对象 现在pt3=pt1,pt2=NULL
delete pt3;
} //pt2已经被释放掉
void h()
{
auto_ptr<T> pt( new T(1) );
pt.reset( new T(2) ); // 删除由"new T(1)"分配出来的第一个T(2) T(1)已经被delete掉了
} // 最后pt出了作用域,第二个T也被删除了
有时间我们为防止内存泄漏我们可以使用异常捕获。