Как отслеживать распределение памяти в C ++ (особенно new / delete) - PullRequest
28 голосов
/ 13 января 2009

Как я могу отследить выделения памяти в C ++, особенно те, которые выполняются new / delete. Для объекта я могу легко переопределить operator new, но я не уверен, как глобально переопределить все выделения, чтобы они проходили через мой пользовательский new / delete. Это не должно быть большой проблемой, но я не уверен, как это должно быть сделано (#define new MY_NEW?).

Как только это сработает, я предполагаю, что достаточно иметь где-то карту указателя / местоположения выделения, чтобы я мог отслеживать все выделения, которые в данный момент являются «активными» и - в конце приложения - проверить выделения, которые не были освобождены.

Ну, это опять похоже на то, что, конечно, было сделано, по крайней мере, несколько раз, так что есть какая-нибудь хорошая библиотека (желательно портативная)?

Ответы [ 16 ]

0 голосов
/ 29 июля 2017

Если мне нужен инструмент, я обычно начинаю с того, что предоставляет мой компилятор / стандартная библиотека.

  • Если вы используете glibc, вы можете использовать mtrace . Он устанавливает глобальный хук, который регистрирует каждую функцию выделения памяти glibc (malloc, realloc, memalign, free и все, что реализовано поверх них, как new / delete)
  • Если вы используете Microsoft CRT, вы можете посмотреть CRT Debug Heap Details . Есть примеры того, как установить отладочную версию функций выделения памяти, получить статистику кучи, найти утечки памяти и т. Д.
0 голосов
/ 05 января 2014

Вы можете использовать добавить файл заголовка ( MemTracker.h ), указанный в этой ссылке в Ваше решение для отслеживания выделения / освобождения памяти в C и C ++. Он показывает, есть ли у вас утечка памяти и какая строка кода отвечает за это.

0 голосов
/ 26 февраля 2011

Это недешево, но в свое время на С ++ я обнаружил, что очистить - лучший инструмент для устранения утечек и других проблем с памятью (сейчас он принадлежит IBM, поэтому surport пошла в гору ). Bounds Checker понравился некоторым людям, но он плохо работал с программным обеспечением, которое я разрабатывал.

0 голосов
/ 13 января 2009

Я заметил, что многие другие ответы сосредоточены на том, какие инструменты вы можете использовать. Я использовал некоторые из них, и они очень помогают.

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

Затем, как только вы это сделаете, вы можете начать добавлять заголовки, чтобы проверять перезаписи памяти, трассировки стека записей для каждого выделения и т. Д.

В целом, я бы порекомендовал вам использовать один из инструментов, упомянутых здесь, но было бы интересно написать свою собственную систему.

0 голосов
/ 13 января 2009

Если вы разрабатываете под Linux, одним из лучших инструментов для этого (например, обнаружение утечек памяти, отслеживание выделений в определенных местах кода) является valgrind, особенно его инструмент массива. Единственным недостатком является то, что программа работает медленнее (или намного медленнее), поэтому она полезна только для отладки.

0 голосов
/ 13 января 2009

Если вы хотите сделать это как упражнение по программированию, это может дать вам гораздо больше понимания, чтобы вместо этого написать свой собственный класс (ы) интеллектуальных указателей и последовательно использовать их в этом проекте (или модуле проекта). 1001 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...