C++中有auto_ptr,可以把动态分配的内存自动的delete掉,但是auto_ptr有个缺点,就是不能delete数组。即它只能调用delete,不能调用delete[]。可以设计这样一个类来自动调用delete[]来释放数组并正确调用析构函数:
template <typename T>
class ArrayDeletor {
private:
T * array_;
public:
ArrayDeletor(T * array): array_(array) {}
T *release() { T * ret = array_; array_ = 0; return ret; }
~ArrayDeletor() { if (array_ != 0) delete[] array_; }
};
usage:
T * f() //函数要求返回分配的对象数组
{
T * a = new A[10];
ArrayDeletor<A> deletor(a);
...
if (error) return 0;
...
if (exception) throw exception(); //也不会内存泄漏
...
return deletor.release(); //传递owership
}
C++语言的自动调用析构函数是个非常有用的功能,利用这个功能可以大大减少资源的泄漏