2016-04-30 3 views
0

Я имитируя блок памяти со статическим массивом структур, которые принимают форму:память Deallocation моделирование Выпуск

typedef struct memBlock 
{ 
    unsigned int isAllocated = 0; 
    unsigned int processID = 0; 
}memBlock; 

Я уже получил malloc() -как функции, которая имитирует таНос принимая в запрашиваемом размер памяти из процесса и маркировку части массива, занятой установкой isAllocated, равной 1, и изменение PID на идентификатор процесса запрашивающего процесса.

Итак, теперь я хочу написать функцию типа free, которая освободит память от этого массива, установив isAllocated в 0 и PID на 0, но как это сделать? Я знаю концептуально, что мне нужно начинать с индекса 0 этого массива и, возможно, проверять первый индекс, где isAllocated = 1 и ненулевой PID? я уже это реализовано до сих пор:

void* custom_free(void* ptr, unsigned int size) 
{ 
    unsigned int blockIndex = 0, sizeCount = 0, startIndex = 0; 
    if(ptr){ free(ptr); } 
} 

Edit: Раньше в моем коде у меня есть таНос призыв к структуре memBlock, как это:

memBlock *block = (memBlock *)malloc(BLOCK_SIZE);

где BLOCK_SIZE препроцессор определена константа

+0

@WhiZTiM Удаление тега C++ может быть преждевременным, поскольку встроенная инициализация членов структуры, как показано в структуре 'memBlock', невозможна в C, но она находится на C++. –

+0

Это не C, а C++. Вы должны использовать операторы C++ 'new' /' delete'. И удалите тег C. – Olaf

+0

Возможно, вы не поняли мой комментарий. Итак, повторим: ** это не C-код, но C++ ** C и C++ - разные языки, и вы должны использовать правильный тег. – Olaf

ответ

1

Общим способом хранения информации о выделенных блоках памяти с помощью распределителя является сохранение структуры информации в выделенном ею блоке памяти.

Таким образом, вместо выделения size байт, вы выделяете size + sizeof(memBlock) байт, и использовать указатель, как указатель на структуру memBlock и заполнить необходимую информацию. Затем верните указатель на память после структуры memBlock (то есть примерно &((memBlock *) ptr)[1]).

При освобождении вы вычтите размер структуры memBlock, чтобы получить исходный указатель, который указывает на структуру memBlock.

Это, конечно, делает такой член как isAllocated практически бесполезным. Если у вас есть свои собственные блоки и выделяются только в кратных единицах, вам необходимо сохранить информацию о том, какие блоки были выделены, а также количество блоков.

+0

Это имеет больше смысла, но почему именно 'isAllocated'now бесполезно? Как еще я могу различать занятый и пустой блок, кроме использования 'isAllocated'? – user02103012