由于种种原因,我们无法保证所有通过new在heap中申请的内存资源都安全地得到释放,例如:
class base{...};
void f()
{
base* ptr = new base;
...
delete ptr;
}
这样一系列操作中,在"..."中可能会抛出异常,最终导致delete无法得到执行,于是就造成了内存泄露。尽管我们可以设法避免在"..."中抛出异常,但是,对于后来维护和修改这段代码了人员来说,很可能加入一些控制流,从而过早地从函数从中返回,内存泄露再次发生。
一种解决之道就是,将资源封装在一个类中,利用类的析构函数来释放该资源,这样一来,无论是何种方式退出f()函数的作用域,类的析构函数总是会被调用,从而有效地避免了资源泄露。
auto_ptr就是这种方法的一种典型应用。它被称为智能指针,是一个模板类。声明一个只能指针的方法是:auto_ptr ptr(new T);为了说明auto_ptr的用法,下面是一个具体的例子:
#include <iostream>
#include <memory> //为了使用auto_ptr你必须包含头文件:#include <memory>
using namespace std;
class demo
{
public:
demo ()
{
cout << "demo()" << endl;
}
~demo ()
{
cout << "~demo()" << endl;
}
};
void
test_org ()
{
cout << "test_org():" << endl;
demo *ptr = new demo;
return;
}
void
test_auto ()
{
cout << "test_auto():" << endl;
auto_ptr < demo > ptr (new demo);
return;
}
int
main (int narg, char **arg)
{
test_org ();
test_auto ();
return 0;
}
linux下,g++编译器的输出结果如下:
~$ g++ test.cpp -o test
~$ ./test
test_org():
demo()
test_auto():
demo()
~demo()