【问题标题】:Safely delete pointer to array of pointers安全删除指向指针数组的指针
【发布时间】:2012-02-14 11:20:11
【问题描述】:

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

谢谢

【问题讨论】:

  • 您是否有特殊原因不使用std::vector

标签: c++ arrays pointers


【解决方案1】:

我认为您需要做的是创建一个堆栈对象,该对象接受一个指向指针数组的指针,并在其析构函数中进行清理。比如:

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

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

【讨论】:

    【解决方案2】:

    如果异常抵抗是目标,那么你不应该做这样的事情--

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

    【讨论】:

    • 如果析构函数抛出,世界就完了。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-05-10
      • 2015-08-09
      • 2015-07-15
      • 2010-09-08
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多