Это имеет склонность к безопасности, но очень богатый контент.http://www.blackhat.com/presentations/bh-usa-07/Ferguson/Whitepaper/bh-usa-07-ferguson-WP.pdf
Вот документация glibc по взаимодействию с системой: http://www.gnu.org/software/libc/manual/html_node/Heap-Consistency-Checking.html
Краткий ответ: Реализация распределения кучи обычно помещает значения стража перед возвращаемой памятью (и иногдапосле него).
В качестве фальшивого примера, поясняющего смысл, если вы запрашиваете 1000 байтов, 1012 байтов / может быть / выделено в 32-битной системе.Скажите 4 байта для указателя на то, что куча находит значимым, 4 байта для часового, например, 0x500DF00D, и, возможно, 4 байта в конце для другого часового, например, 0xABCDABCD.
Когда вы делаете 'free', тогда freeможно сделать несколько вещей.Найти контекст, посмотрев на этот указатель.Проверьте часовых на предмет превышения / недопущения и проверьте на двойное освобождение.Как это делает последнее.Давайте предположим, что буфер выглядел хорошо на 1-м свободном.
Если все выглядит хорошо, он может сделать что-то вроде изменения 0x500DF00D на 0x0BADF00D.
Так что free () также может проверить BADF00D для обнаружения несколькихпопытки освободить.
Есть еще много вопросов, таких как безопасность потоков в распределителе;как долго вы держитесь за этого стража свободной памяти, прежде чем отдать этот блок обратно для другого выделения и т. д. Но это основное объяснение того, как это обычно делается.