Как освободить память структур, на которые указывает указатель-массив? - PullRequest
0 голосов
/ 25 августа 2010

У меня есть массив указателей, определенный как some_struct * t_ptr[1000], который указывает на структуру some_struct. И некоторые точки массива точек оцениваются. Например,

some_struct * wpaper1 = new some_struct();    //memory leaks detected in this line 
wpaper1->tAnswer = useransw;
wpaper1->tKey = key;
t_ptr[100] = wpaper1;

//there're wpaper2,wpaper3....
...

delete[] t_ptr;   //release the pointers

В сообщении отладки говорится, что в коде первой строки обнаружены утечки памяти. Как я могу освободить память some_struct, указанную массивом t_ptr? Нужно ли использовать цикл, чтобы определить, является ли элемент оценивается, а затем удалить его? И я использую VS2008 на Windows. Спасибо.

Ответы [ 2 ]

2 голосов
/ 25 августа 2010

Ваше удаление [] t_ptr будет правильным только в том случае, если вы разместили t_ptr в куче, аля:

some_struct* t_ptr = new tpr[1000];

Затем оператор delete [] освобождает память для этих 1000 указателей, но ничего не делает с памятью, на которую могут ссылаться сами указатели. Чтобы освободить это, вам нужно сначала зациклить элементы t_ptr, удалив их один за другим:

for (i = 0; i < 1000; ++i)
    delete t_ptr[i];
delete[] t_ptr;

Вы должны убедиться, что указатели изначально установлены в NULL, хотя удаление указателя NULL не является операцией, поэтому вам не нужно проверять цикл выше.

Это боль, не так ли? Вот почему очень хорошее руководство для новых программистов на C ++ - использовать векторы и умные указатели (например, из boost). Эти типы освобождаются, когда выходят из области видимости или выходят из программы ... вам даже не нужно об этом думать.

1 голос
/ 25 августа 2010

Да, вам нужно перебрать t_ptr и удалить все элементы, отличные от NULL (при условии, что вы инициализировали элементы в NULL, прежде чем начать выделение). Вы должны быть в состоянии определить в своем коде, где каждый delete соответствует каждому new.

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