Несмотря на то, что некоторые люди возмущаются этим, в книге «Написание твердого кода» Стива Магуайра есть много разумных идей о том, как отслеживать использование памяти без изменения функций выделения системной памяти. По сути, вместо непосредственного вызова необработанных функций malloc()
и т. Д. Вы вызываете свой собственный API распределения памяти, построенный поверх стандартного. Ваш API может отслеживать выделение и освобождение, обнаруживать двойное освобождение, освобождение нераспределенной памяти, невыпущенную (утечку) памяти, полный дамп того, что выделено, и т. Д. Вам нужно либо написать код из книги, либо написать собственный эквивалентный код , Одна интересная проблема заключается в предоставлении трассировки стека для каждого выделения; Не существует стандартного способа определения стека вызовов. (Книга немного устарела; она была написана всего через несколько лет после опубликования стандарта C89 и не использует квалификаторы const
.)
Некоторые утверждают, что эти услуги могут предоставляться системой malloc()
; действительно, они могут, и в наши дни часто. Вам следует внимательно изучить руководство, предоставленное для вашей версии malloc()
, и решить, достаточно ли оно для вас. Если нет, то механизм API-оболочки является разумным. Обратите внимание, что использование вашего собственного API означает, что вы отслеживаете то, что вы явно выделяете, оставляя библиотечные функции не написанными для использования вашего API с использованием системных служб - как, впрочем, и ваш код, под прикрытием.
Вам также следует заглянуть в valgrind
. Он отлично отслеживает злоупотребления памятью и, в частности, сообщает об утечке памяти (памяти, которая была выделена, но не освобождена). Он также определяет, когда вы читаете или пишете за пределами выделенного пространства, обнаруживая переполнения буфера.
Тем не менее, в конечном счете, вам нужно быть дисциплинированным в том, как вы пишете свой код, чтобы каждый раз, когда вы выделяете память, вы знали, когда она будет освобождена.