我有一个指针数组的指针,无论发生异常,我都希望将其安全删除。现在我必须遍历数组并在每个项目上调用delete,然后在数组上调用delete []。 auto_ptr似乎只是删除了数组,但没有删除数组中的单个指针。对此有一个简单的解决方案吗?
double** desc = new MyObject*[size_out];
for (int i=0; i<size_out; i++)
desc[i] = new MyObject();
for (int i=0; i<size_out; i++)
delete desc[i];
delete [] desc;
由于
答案 0 :(得分:0)
我认为你需要做的是创建一个堆栈对象,它接受一个指针数组的指针,并在其析构函数中进行清理。类似的东西:
template <typename T>
struct ArrayDeleter
{
ArrayDeleter(T** array, size_t size)
: m_array(array), m_size(size)
{}
~ArrayDeleter()
{
for (size_t i = 0; i != m_size; ++i)
{
delete m_array[i];
}
delete [] m_array;
}
T** m_array;
size_t m_size;
};
没有智能指针可以做到这一点,所以你必须自己动手。
答案 1 :(得分:0)
如果目标是异常阻力,那么你不应该做这样的事情 -
for (int i=0; i<size_out; i++)
{
try
delete desc[i];
catch(...)
continue;
}
delete [] desc;
答案 2 :(得分:0)
一个好的经验法则是确保构造函数和析构函数不会抛出异常。在构造函数/析构函数中捕获它们。然后,您可以删除单个指针,然后删除数组。