Хотя «malloc» и «free» описаны в терминах создания выделений и их уничтожения, их реальная роль противоположна этому.Функция «malloc ()» берет некоторую память из пула и указывает, что диспетчеру памяти не разрешено использовать ни один из байтов в выделенном диапазоне (хотя байты были вне этого диапазона, включая те, которые непосредственно предшествуют и следуют за выделением,оставаться доступным для него).Функция «free ()» добавляет память обратно в пул, делая ее доступной для использования в будущем.
В некоторых системах распределения функция, которая освобождает память, принимает аргумент, указывающий, сколько памяти освобождается;другие могут требовать, чтобы каждый пул использовался только для распределения объектов фиксированного размера.Некоторые системы, которые делают такие вещи, позволят коду добавить любой кусок памяти, который не понадобится программе для каких-либо других целей, в пул, просто «освободив» его, диспетчер памяти будет знать или заботиться о том, пришла ли память избассейн в первом случае.Действительно, в некоторых таких системах, в первую очередь, могут создаваться пулы: инициализировать дескриптор для пустого пула памяти, а затем «выпустить» в него порции хранилища, как это удобно.
Такой подхододнако добавление хранилища в пул памяти не может работать в C, поскольку единственный способ «освободить» может знать, сколько памяти добавить в пул, - это использовать информацию, которая была где-то сохранена «malloc».Как правило, информация хранится в пространстве непосредственно перед хранением, которое malloc () предоставляет приложению.Если указатель не был создан malloc()
, хранилище, непосредственно предшествующее хранилищу, описанному указателем, не будет содержать информацию, необходимую для malloc (), но, скорее всего, будет содержать шаблон байтов, который выглядит так, как будто он был созданвыделение какого-то бессмысленного размера.Это может привести к тому, что диспетчер памяти будет делать все, что ему захочется, с большим объемом памяти, который, вероятно, выйдет за пределы объекта, адрес которого был ему передан.Веселость, вероятно, наступит, когда менеджер памяти примет приложение по этому приглашению.