Утечка памяти в с ++ - PullRequest
       4

Утечка памяти в с ++

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

Как обнаружить утечку памяти. Я имею в виду, есть ли какой-либо инструмент / утилита или какой-либо фрагмент кода (т.е. перегрузка оператора new и delete) или мне просто нужно проверить новое и удалить в коде ??

Если есть какой-либо инструмент / утилита, пожалуйста, сообщите мне. и если код есть, то какой код может объяснить кто-нибудь?

Ответы [ 6 ]

3 голосов
/ 28 февраля 2011

Инструменты, которые могут вам помочь:
Linux: valgrind
Win32: MemoryValidator

Вы должны проверить каждый бит памяти, который выделяется (new, malloc, ...), если он освобождается, используя соответствующую функцию (delete, free, ...).

2 голосов
/ 28 февраля 2011
  • Используйте, например, boost: shared_ptr вместо обнаженных указателей.
  • Анализируйте ваше приложение одним из следующих способов: http://en.wikipedia.org/wiki/Memory_debugger
0 голосов
/ 28 февраля 2011

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

Если вы работаете в OS X с Xcode, вы можете использовать инструмент Leaks. Если вы щелкнете по инструменту «Выполнить с производительностью» и выберете «Утечки», он покажет выделенную и просочившуюся память.

Что-то помнить, хотя. Большинство перечисленных инструментов описывают только инструменты, которые улавливают утечки памяти по мере их возникновения. Так что если у вас есть какой-то код, который вызывает утечку памяти, но редко вызывается (или достаточно редко, чтобы вы не сталкивались с ним при тестировании на утечки памяти), то вы можете пропустить его. Если вы хотите что-то, что действительно проходит через ваш код, вам понадобится статический анализатор. Единственный, кого я знаю, это Clang Static Analyzer , но он предназначен для C и Obj-C (я не знаю, поддерживает ли он C ++).

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

Я также могу порекомендовать UMDH: http://support.microsoft.com/kb/268343

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

valgrind - очень мощный инструмент, который вы можете использовать для обнаружения утечек памяти. После установки вы можете запустить

valgrind --leak-check=full path/to/program arguments...

и valgrind запустит программу, найдет утечки и сообщит вам о них.

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

Один из способов - вставить строки имени файла и номера строки (через указатель) модуля, выделяющего память, в выделенный блок данных. Файл и номер строки обрабатываются с помощью стандартных макросов C ++ « FILE » и « LINE ». Когда память освобождается, эта информация удаляется.

Одна из наших систем имеет эту функцию, и мы называем ее «отчет о переполнении памяти». Поэтому в любое время из нашего CLI мы можем распечатать всю выделенную память вместе с большим списком информации о том, кто выделил память. Этот список отсортирован по тому, какому модулю кода выделено наибольшее количество памяти. Много раз мы будем отслеживать использование памяти таким образом с течением времени, и в конечном итоге задержка памяти (утечка) будет подниматься вверх по списку.

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