LINUX.ORG.RU

История изменений

Исправление KivApple, (текущая версия) :

Это зависит от имплементации менеджера памяти. Фактически же перед куском занятой памяти минимально необходимо хранить лишь его длину 1x size_t, иметь связанный список занятых блоков памяти для базовой реализации malloc/free нет потребности. А вот свободные блоки памяти уже нужно выстраивать в список, чтобы потом malloc в нём мог искать откуда выделить память. Таким образом в свободной памяти лежит минимум 1x void* + 1x size_t (связанный список), а возможно даже 2x void* и 1x size_t (двунаправленный связанный список удобнее для удаления-вставки в произвольную позицию).

Так что free может записывать в блок памяти более длинную структуру, чем туда записывал malloc, разрушая начало бывших данных.

Я это пишу по опыту написания игрушечного менеджера памяти для игрушечной ОС много лет назад - мой free разрушал данные. А так как это не противоречит стандарту, ничто не мешает это делать и не игрушечным libc. Тем более что 30 лет назад об эффективности использования памяти беспокоились гораздо больше, а описанный подход уменьшает оверхед аллокаций (а ещё 30 лет назад никому не нужно было выравнивание malloc больше чем на sizeof size_t, потому что не было всяких SSE).

Исправление KivApple, :

Это зависит от имплементации менеджера памяти. Фактически же перед куском занятой памяти минимально необходимо хранить лишь его длину 1x size_t, иметь связанный список занятых блоков памяти для базовой реализации malloc/free нет потребности. А вот свободные блоки памяти уже нужно выстраивать в список, чтобы потом malloc в нём мог искать откуда выделить память. Таким образом в свободной памяти лежит минимум 1x void* + 1x size_t (связанный список), а возможно даже 2x void* и 1x size_t (двунаправленный связанный список удобнее для удаления-вставки в произвольную позицию).

Так что free может записывать в блок памяти более длинную структуру, чем туда записывал malloc, разрушая начало бывших данных.

Я это пишу по опыту написания игрушечного менеджера памяти для игрушечной ОС много лет назад - мой free разрушал данные. А так как это не противоречит стандарту, ничто не мешает это делать и не игрушечным libc. Тем более что 30 лет назад об эффективности использования памяти беспокоились гораздо больше, а описанный подход уменьшает оверхед аллокаций.

Исходная версия KivApple, :

Это зависит от имплементации менеджера памяти. Фактически же перед куском занятой памяти минимально необходимо хранить лишь его длину 1x size_t, иметь связанный список занятых блоков памяти для базовой реализации malloc/free нет потребности. А вот свободные блоки памяти уже нужно выстраивать в список, чтобы потом malloc в нём мог искать откуда выделить память. Таким образом в свободной памяти лежит минимум 1x void* + 1x size_t (связанный список), а возможно даже 2x void* и 1x size_t (двунаправленный связанный список удобнее для удаления-вставки в произвольную позицию).

Так что free может записывать в блок памяти более длинную структуру, чем туда записывал malloc, разрушая начало бывших данных.

Я это пишу по опыту написания игрушечного менеджера памяти для игрушечной ОС много лет назад - мой free разрушал данные. А так как это не противоречит стандарту, ничто не мешает это делать и не игрушечным libc. Тем более что 30 лет назад об эффективности использования памяти беспокоились гораздо больше.