2013-09-20 2 views
1

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

+5

Это зависит от реализации. Если вы посмотрите на реализацию своей стандартной библиотеки, вы всегда можете попробовать заглянуть в связанные с ней структуры данных, но * вы не должны *. Поэтому вы можете попробовать это для науки, но не ставьте это в производственный код. – Thomas

+0

Прочитайте исходный код вашего распределителя. Для этого, я полагаю, вам сначала нужно определить, какой распределитель использует ваша библиотека или ваш проект (например, ptmalloc2, tcmalloc). Вы также можете проверить GCC 'malloc.h' для некоторых функций GCC-специфичных функций. Работа с внутренними элементами выделения и освобождения является ядром уязвимостей ошибок кода на основе кучи, поэтому есть много «интереса сообщества», если хотите. –

ответ

2

Даже если он работает, он не будет переносимым вообще. Стандарт ничего не говорит об этом.

Это зависит от реализации, и вы не можете положиться на это.

3

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

В C нет портативного способа извлечения объема памяти, выделенного указателю, через сам указатель.

2

Когда вы используете malloc, вы получаете необходимый объем памяти или указатель null. Итак, в этот момент вы знаете количество байтов, и вам нужно сохранить его, если хотите его использовать.

Как malloc и free работ зависят от операционной системы. Каждая версия каждой ОС могла бы выполнять эту операцию по-разному.

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