Безопасно удалить указатель на массив указателей - PullRequest
1 голос
/ 14 февраля 2012

У меня есть указатель на массив указателей, которые я хочу безопасно удалить независимо от того, где происходят исключения. Сейчас я должен пройтись по массиву и вызвать 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;

Спасибо

Ответы [ 3 ]

0 голосов
/ 14 февраля 2012

Если целью является исключение, то разве вы не должны делать что-то подобное -

for (int i=0; i<size_out; i++)
{
   try
      delete desc[i];
   catch(...)
      continue;
}
delete [] desc;
0 голосов
/ 14 февраля 2012

Хорошее правило - убедиться, что конструкторы и деструкторы не генерируют исключения. Поймай их в конструкторе / деструкторе. Затем вы можете удалить отдельные указатели, а затем массив.

0 голосов
/ 14 февраля 2012

Я думаю, что вам нужно будет создать стековый объект, который получает указатель на массив указателей и выполняет очистку в его деструкторе. Что-то вроде:

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

Нет умного указателя, который бы делал это, поэтому вам просто нужно сделать это самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...