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

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

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

 Gabriel Southern06 мая 2012 г., 20:38
Что ты ожидал?
 qwertz06 мая 2012 г., 20:39
Что ты сделал сstr до
 GSerg06 мая 2012 г., 21:17
Обязательная ссылка: Stackoverflow.com / а / 6445794/11683

Ответы на вопрос(5)

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

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

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

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

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

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

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

Ваш ответ на вопрос