当程序出现异常时要进行throw e,然后退出时,这就涉及到函数中对象的析构问题了,如果对象是在栈中定义的,那么可以自动调用析构函数,不需要进行处理。但是如果定义的是指针,在堆中开辟的空间,就需要注意了,因为这个空间系统默认是不会自动回收的。C++为了防止这个问题,而引入了auto_ptr和shared_ptr的设计模式,即对象如果不用了将自动析构。下面的程序就能够说明这一点了:
//test.cpp文件
#include<iostream>
#include<memory>
using namespace std;
class MyClass
{
int i;
public:
MyClass(int x):i(x){}
~MyClass()
{
cout<<i<<"调用析构函数\n";
}
};
void fun()
{
MyClass first(1);
MyClass *second=new MyClass(2);
//注意这里不要写成shared_ptr<MyClass> sp=new MyClass(3);这是要调用构造函数的,不是拷贝构造函数
auto_ptr<MyClass> sp(new MyClass(3));
int x=0;
if(x==0)
throw 'x';
cout<<"123"<<endl;
}
int main()
{
try
{
fun();
}
catch(char mess)
{
cout<<mess;
}
system("pause");
return 0;
}
输出结果:3调用析构函数
1调用析构函数
x