Когда вы выделяете блок, вы выделяете немного больше места, сохраняете свой заголовок в начале блока, а затем возвращаете указатель на смещение в блоке (а не в начале блока). Например, «вернуть alloc + sizeof (MY_HEADER)».
Когда вы освобождаете блок, вы должны делать обратное. Например:
BOOL BmiDibFree(HANDLE callerPointer)
{
actualPointer = callerPointer - sizeof(MY_HEADER);
free(actualPointer);
Примечание 1: Для повышения производительности вы должны убедиться, что sizeof (MY_HEADER) кратно минимальному выравниванию, предоставленному malloc (); таким образом, у вызывающего абонента не возникает проблем с выравниванием.
Примечание 2: Вы можете добавить «канареек» (магические числа) в реальном начале блока и в реальном конце блока и проверять их (во время free и realloc), чтобы увеличить вероятность обнаружения повреждения кучи. Я делаю это и устанавливаю флаг «куча была повреждена», и проверяю этот флаг перед любым malloc / free / realloc (если куча была повреждена, все последующие операции сразу завершаются неудачно, чтобы избежать увеличения беспорядка).
Примечание 3: Вы можете использовать условную компиляцию (например, "#ifdef DEBUGGING"), чтобы включить / отключить различные функции вашей оболочки. Я делаю это тоже - один для включения дополнительной проверки (канареек) и один для сбора / представления статистики (общее количество выделенных блоков, максимальное количество блоков, выделенных в любое время, общее количество выделенных байтов, максимальное количество байтов, выделенных в любое время).