Application Verifier в сочетании с инструментами отладки для Windows - удивительная установка. Вы можете получить как часть комплекта драйверов Windows, так и более легкий пакет Windows SDK . (Узнал о Application Verifier при исследовании более раннего вопроса о проблеме повреждения кучи .) Я также использовал BoundsChecker и Insure ++ (упомянутые в других ответах) и в прошлом, хотя я был удивлен, насколько много функциональности было в Application Verifier.
Стоит упомянуть Electric Fence (он же «efence»), dmalloc , valgrind и т. Д., Но большинство из них гораздо проще запустить под * nix, чем Windows. Valgrind смехотворно гибок: я отлаживал программное обеспечение для больших серверов со многими проблемами кучи, используя его.
Когда все остальное терпит неудачу, вы можете предоставить своему собственному глобальному оператору перегрузки new / delete и malloc / calloc / realloc - как это будет немного различаться в зависимости от компилятора и платформы - и это будет немного вложено - но это может окупиться в долгосрочной перспективе. Список желаемых функций должен выглядеть знакомым по dmalloc и electricfence, а также поразительно превосходной книге « Написание твердого кода» :
- значения Sentry : оставьте немного больше места до и после каждого размещения, соблюдая требования максимального выравнивания; заполнить магическими числами (помогает улавливать переполнения и переполнения буфера и случайный «дикий» указатель)
- alloc fill : заполнять новые выделения магическим ненулевым значением - Visual C ++ уже сделает это за вас в сборках отладки (помогает отловить использование неинициализированных переменных)
- free fill : заполнить освобожденную память магическим значением, отличным от 0, предназначенным для запуска сегментарного сбоя, если в большинстве случаев он разыменовывается (помогает отлавливать висячие указатели)
- освобождение с задержкой : не возвращать освобожденную память в кучу на некоторое время, держать ее свободной, заполненной, но недоступной (помогает отлавливать больше висячих указателей, ловит близкие двойные освобождения)
- отслеживание : возможность записать, где было сделано выделение, иногда может быть полезным
Обратите внимание, что в нашей локальной системе доморощения (для встроенной цели) мы держим отслеживание отдельно от большинства других вещей, потому что время выполнения намного выше.
Если вас интересуют другие причины перегрузки этих функций / операторов распределения, взгляните на мой ответ: «Есть ли причина перегрузить глобальный оператор new и delete?» ; Помимо бесстыдного саморекламы, в нем перечислены другие методы, которые помогают отслеживать ошибки повреждения кучи, а также другие применимые инструменты.
Поскольку я продолжаю находить здесь свой собственный ответ при поиске значений alloc / free / fence, которые использует MS, вот еще один ответ, который охватывает значения заполнения dbgheap от Microsoft .