2012-02-14 2 views
1

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

вы должны пометить язык –

+1

У вас есть конкретная причина не просто использовать 'std :: vector'? –

ответ

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

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

0

Если сопротивление Исключение составляет цель, то не нужно делать что-то вроде this--

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

Если деструктор бросает, мир все равно. – Xeo

0

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

Смежные вопросы