разделить пространство памяти malloc - PullRequest
1 голос
/ 06 декабря 2010

Я использую MS VS 2010, C ++, неуправляемый.Я хотел бы разделить выделенную область, если это возможно.Например, допустим, я выделил 1 КБ пространства в памяти:

void* space = malloc(1024);

позже, я решил использовать этот блок как отдельные пробелы 512B и 512B:

space1 = 512B and space2 = 512B

и, наконец, когда я захочучтобы избавиться от этих пробелов, я хочу освободить их отдельно:

free(space1);
free(space2);

возможно ли это без перераспределения / расширения / сжатия памяти?

Спасибо всем ..

Ответы [ 3 ]

1 голос
/ 06 декабря 2010

Короче говоря: вам придется написать свой собственный распределитель памяти поверх malloc / new.

Более длинная версия: поскольку реализации распределителя памяти различаются, нет никакого способа переносимо изменить их внутренние структуры данных, которыеотслеживать выделенные и свободные блоки и их границы.

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

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

Опять же, вам лучше написать свой собственный распределитель.

Еще лучше, если это вообще возможно, попытаться найти альтернативные способы управления вашимобъем памяти.Может быть, вам больше нужны распределители пулов.

1 голос
/ 06 декабря 2010

Нет, вы не можете освободить их по отдельности, так как malloc () сохранит только одну копию необходимых учетных данных, поэтому может освободить только один фрагмент. Вы должны написать свои собственные malloc / free wrappers.

0 голосов
/ 06 декабря 2010

Вы можете использовать Windows API для кучи: http://msdn.microsoft.com/en-us/library/aa366711(VS.85).aspx

HeapAlloc() эквивалентно malloc.Основное отличие заключается в том, что получает еще один параметр: какую кучу использовать.Эти кучи могут быть созданы с помощью HeapCreate, и вы можете зарезервировать для них место.

...