Вопрос по c – free () не освобождает память?

0
<code>free(str);
printf("%d\n", str->listeners);
</code>

Вызов printf завершается успешно (как и любые другие вызовы членов str). Как это возможно?

Что ты ожидал? Gabriel Southern
Что ты сделал сstr до qwertz
Обязательная ссылка: Stackoverflow.com / а / 6445794/11683 GSerg

Ваш Ответ

5   ответов
2

ние - все может произойти, в том числе выглядит, как память не была освобождена.

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

4

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

2

который ссылается на освобожденную память. Все может произойти, то есть нельзя предполагать, что программа потерпит крах или что-то еще; поведение Неопределенный.

1

str не являетсяNULL и соответствующая память не была перезаписана каким-либо другим распределением, если она все еще работает, потому что содержимое памяти не изменяетсяfree (если среда выполнения не перезаписывает область памяти наfree). НО это определенно неопределенное поведение, и вы НЕ МОЖЕТЕ полагаться на него, чтобы он работал таким образом ...

Ну, этомо будет измененоfree(). Дело в том, что поведение этой программы не определено. Ed S.
@ EdS. что я и написал в последнем предложении! Yahia
Ты добавил это после свершившегося факта. Я отклонил ваш оригинальный пост. Если вы не хотите, чтобы отрицательные голоса не спешили Ed S.
@ EdS. если я продолжаю редактировать свой пост в течение первой минуты или около того "после факта", то я виноват ... Yahia
Ну ... да: D. Я видел ваш оригинальный ответ, прежде чем вы сделали редактирование. Какую другую информацию я должен продолжить? Должен ли я предположить, что вы будете редактировать его когда-нибудь в будущем, чтобы быть правильны Ed S.
0

Практически во всех современных операционных системах,free() никогда не возвращает память операционной системе. Даже если он теоретически способен на это, это почти никогда не произойдет. Это связано с тем, что память может быть возвращена только на выровненных страницах размером, как правило, 4 КБ, потому что именно так работает MMU, и, если он будет найден, его удаление может привести к фрагментации блока, включающего память над и под ним, что сделает весь процесс контрпродуктивный. (Фрагментация - враг эффективного использования динамической памяти.) Кроме того, большинство программ, как правило, просто используют больше памяти, поэтому время, потраченное на поиск чего-либо, чтобы действительно вернуться к ОС, было бы полностью потрачено впустую. Если он не будет возвращен ОС, а затем защищен, при касании он не станет ядром вашей программы. Так что вместо этого получается, что блок, который вы дали свободному, просто помещается в список или некоторую другую структуру данных, а затем, возможно, объединяется в блоки выше или ниже него. Память все еще там и доступна. Некоторые блоки могут быть перезаписаны указателями и другими внутренними компонентами библиотечного кода за функциями malloc () и free (). Но это не может быть. В конечном итоге это может быть передано в другом месте вашей программы. Но это не может быть.

Похожие вопросы