Инициализация блока памяти со значениями NULL эквивалентна свободной? - PullRequest
0 голосов
/ 18 июля 2011

Предположим, у меня есть указатель * p, который указывает на 10 блоков памяти в куче. Теперь вместо free () я очищаю его вручную с NULL (или '\ 0') следующим образом:

for (int i = 0; i < length; ++i{
     p[i] = '\0';
}

Считается ли это, что блок памяти освобождается, когда каждый бит очищается до нуля? Или я должен использовать free (), чтобы сообщить операционной системе, что блок памяти действительно освобожден и его можно использовать (я думаю)?

Ответы [ 7 ]

5 голосов
/ 18 июля 2011

Вам делать необходимо вызвать free() для возврата памяти операционной системе.

Блок памяти, заполненный нулями, не более "свободен", чем блок, полныйединицы.

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

4 голосов
/ 18 июля 2011

ОС имеет структуры данных в куче, которая отслеживает, что выделено и где. Используя malloc и бесплатно обновляя эти структуры, вы не сможете сделать это вручную. Вы теряете память, если просто обнуляете содержимое памяти.

4 голосов
/ 18 июля 2011

Пока вы не free блок памяти, он все еще зарезервирован.Таким образом, чтобы отменить выделение блока памяти (и снова сделать его доступным для других целей), необходимо вызвать free.

Обнуление блока памяти не влияет на выделенное состояние.этого блока памяти - только на его содержимое.

2 голосов
/ 18 июля 2011

Это не освобождение памяти.Это, безусловно, утечка.

1 голос
/ 18 июля 2011

Считается ли это, что блок памяти освобождается, когда каждый бит очищается до нуля?

Нет. Это просто блок памяти с нулями в качестве контента.

Мне нужно использовать free (), чтобы сообщить операционной системе, что блок памяти действительно освобожден и может использоваться (я полагаю)?

Это зависит. Если вы выделили блок с помощью malloc или calloc (или других функций, которые указывают его явно, например, strdup), то вам нужно вызвать free(). Если вы выделили блок с помощью new или new[], вам необходимо использовать delete или delete[], соответственно, чтобы освободить его.

0 голосов
/ 20 июля 2011

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

Однако память, выделенная для программы, возвращается в операционную систему после ее завершения.(Если ваша программа не использует общую память или память драйвера)

В то же время, не освобождение памяти может привести к неожиданному завершению работы вашей программы из-за недостаточной памяти.*

0 голосов
/ 18 июля 2011

Память, выделенная вами в куче, будет выделяться до тех пор, пока вы не освободите ее (обычно free() или delete / []) в явном виде. Все, что вы делаете в цикле, это используя память, записывая в нее данные.

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