Итак, я привык к управлению памятью на C, где free(pointer)
освободит все пространство, на которое указывает pointer
. Теперь я запутываю себя, когда пытаюсь сделать что-то простое в C++.Удаление динамически выделенного 2D-массива
Если у меня есть 2D массив удваивается, выделенных таким образом, подобное этому
double** atoms = new double*[1000];
for(int i = 0; i < 1000; i++)
atoms[i] = new double[4];
, что было бы правильным методом освобождения памяти в куче, выделенной нового?
Мои мысли были изначально это (потому что мой мозг думал в C):
for(int i = 0; i < 1000; i++)
delete atoms[i];
delete atoms;
Но я уже забыл о существовании оператора delete[]
, поэтому я считаю, что правильный метод заключается в следующем:
for(int i = 0; i < 1000; i++)
delete[] atoms[i];
delete[] atoms;
Важно ли понимать разницу между операторами delete
и delete[]
? Или я могу просто предположить, что всякий раз, когда я выделяю массив с ptr = new x[]
, я должен также освободить его с помощью delete[] ptr
?
версия с 'удалить []' является действительным. Если вы вызываете 'delete []' для объекта без массива, это ub. Вы можете видеть в других вопросах: http://stackoverflow.com/questions/4255598/delete-vs-delete – gomons
Спасибо, у меня возникли проблемы с поиском сообщений по этому поводу по какой-то причине ... но это в значительной степени очистило его. Я отметил это как дубликат этого вопроса. – Alex