安全地删除指向指针数组的指针

Safely delete pointer to array of pointers

本文关键字:指针 数组 删除 安全      更新时间:2023-10-16

我有一个指向指针数组的指针,无论异常发生在哪里,我都希望安全地删除这些指针。现在,我必须循环遍历数组,对每个项调用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;

感谢

我认为您要做的是创建一个堆栈对象,该对象获取指向指针数组的指针,并在其析构函数中进行清理。类似于:

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;
};

没有智能指针可以做到这一点,所以你只需要自己做。

如果目标是抗异常,那么你不应该这样做吗

for (int i=0; i<size_out; i++)
{
   try
      delete desc[i];
   catch(...)
      continue;
}
delete [] desc;

一个好的经验法则是确保构造函数和析构函数不会抛出异常。在构造函数/析构函数中捕获它们。然后可以删除各个指针,然后再删除数组。