Я заметил, что многие другие ответы сосредоточены на том, какие инструменты вы можете использовать. Я использовал некоторые из них, и они очень помогают.
Но, как упражнение по программированию, и, увидев, что вы работаете с c ++, вам нужно будет переопределить глобальные new и delete, а также malloc, free и realloc. Вы могли бы подумать, что будет достаточно только переопределить new и delete, но std :: string и другие классы, вероятно, будут использовать malloc и особенно realloc.
Затем, как только вы это сделаете, вы можете начать добавлять заголовки, чтобы проверять перезаписи памяти, трассировки стека записей для каждого выделения и т. Д.
В целом, я бы порекомендовал вам использовать один из инструментов, упомянутых здесь, но было бы интересно написать свою собственную систему.