2014-01-19 3 views
-3

Вот мой код:Как освободить память от динамического массива? C++

int** tmp = new int*[l]; 
for(int i = 0; i < l; i++) 
    tmp[i] = new int[h]; 


for(int i=0;i< l;i++) 
    delete[] tmp[i]; 
delete[] tmp; 

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

Нормально ли это?

+8

Да, это то, как вы динамически выделяете и свободная память. «CPU не упадет» - и что тогда?В стандарте C++ не говорится, что при использовании 'delete' [] '' '' '' ''' '' '' '' '' '' '' '' '' '' '' '' '' '' \ '']. –

+2

динамическое распределение памяти для памяти не для процессора ... – Netwave

+4

Используйте std :: vector. В самом деле. Это для тебя. –

ответ

8

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

std::vector или boost::multi_array будет лучшим выбором здесь, и они уничтожат без всякого ненужного кода, подверженного ошибкам. В принципе, если вам нужно задаться вопросом, что делает код и правильно ли он, то с ним уже что-то не так.

Загрузка процессора напрямую не связана с распределением памяти, и это всего лишь проблема, с которой вы столкнулись с вашим кодом. Некоторая петля, которая бесконечно опроса ОС для чего-то, может быть причиной этого; У меня нет информации о том, что делает ваш код, помимо выделения и освобождения памяти, поэтому трудно сказать, что можно улучшить.


После вашего комментария ... не полагаться на менеджер задач, чтобы сказать вам реального использования памяти программы. Для этого используйте специальный детектор утечки. Как указано в @ H2CO3, ОС не может сразу сообщить deleted память как бесплатную.

+4

В одиночку предложение «В принципе, если вам нужно задаться вопросом, что делает код и правильно ли он, то с ним уже что-то не так». заслуживает +1;) – leemes

2

В его реализации Barebone, new и delete только сахар над malloc и free (из библиотеки C), так что мы будем рассуждать о тех, вместо этого.

Операционные системы обычно предоставляют примитивы для (де) выделяет память, однако эти примитивы:

  • не столь мелкозернистый, как malloc и free: они работают на 4K блоков, например
  • являются относительно экспансивная: в частности, они часто обнуление памяти

в результате, большинство реализаций malloc и free не просто один-лайн обертки вокруг ОС примитивов, но вместо этого будет содержать пул выделенных страниц и обрабатывать большинство запросов внутренне. В некоторых реализациях даже есть пул для потоков, чтобы избежать конкуренции (например, jemalloc) или нескольких пулов с привязкой к каждой нити (например, tcmalloc).

Это результаты:

  • в быстрых malloc/free вызовов
  • за счет памяти след процесса были несколько выше, чем строго необходимое

Примечание: и у меня нет коснулся фрагментации еще ...

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