2012-04-28 5 views
2

Можно создать дубликат:
What is the best way to check for memory leaks in c++?Проверьте наличие утечек памяти

Там есть способ проверить на наличие утечек памяти после того, как программа закончилась, а также способ проверить, если есть области памяти выделены и еще не выпущены?

Например:

int main() 
{ 
    int *iPtr = new int; 

    // Was allocated memory that is not released yet? 
    return 0; 
    // Memory leaks? 
} 

ответ

4

На linux вы можете использовать valgrind. В окнах вам нужно будет найти профилировщик распределения (есть Purify и AQTime 7), используйте _CrtDumpMemoryLeaks (msvc specific, может создавать ложные срабатывания) или написать пользовательский менеджер памяти, который переопределяет глобальный оператор new/delete и использует использование памяти отчетов.

0

Вы должны попробовать использовать Valgrind.

+1

Не работает на окнах. – SigTerm

+0

Вы правы. Я голосовал за ваш ответ, поскольку он более полный, чем мой :) –

-3

Насколько я знаю, когда вы работаете в пользовательском пространстве, и ваш процесс завершается, вся память, выделенная этим процессом, освобождается и возвращается в операционную систему. (именно сама ОС запускает этот процесс, чтобы вернуть память в свой пул;))
Так что ничего не стоит проверять. Разная история, если вы выполняете какую-либо задачу в пространстве ядра, но сценарии могут отличаться в зависимости от используемой операционной системы. Я думаю,

+0

Очень важно проверить, что код, который вы написали, не выделяет память, которая не выпущена, поэтому есть что-то, что нужно проверить. – gliderkite

+1

«Так что нечего проверять». Неправильно. Если ваша ваша программа достаточно долго сидит в памяти, и она теряет память, она будет медленно снижать производительность системы.Например, некоторые дистрибутивы Linux могут работать ужасно, когда система, наконец, попадает в файл подкачки, хотя ваш опыт может насторожить. Проверка утечки памяти - это способ раннего обнаружения таких ошибок. С «ничего не проверять» вы можете легко закончить писать программы, которые съедают 2 гигабайта оперативной памяти за 5 минут, а затем сбой, так как ОС не позволяет выделять больше. – SigTerm

+0

@ gliderkite Извинения, я, возможно, неправильно понял ваш вопрос. Утечка памяти имеет смысл только тогда, когда ваша программа * работает *. После того, как он завершается, утечки памяти нет. (вся память освобождена) – sergico

1

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

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

Предположим, что программа может быть переписана так, чтобы все, кроме крошечной крошечной части этого мегабайта в секунду, были освобождены на лету, причем эти крошечные экскаваторы оставшейся выделенной памяти снова были освобождены при завершении программы. Все-таки не утечка, строго говоря, но эта программа, безусловно, лучше себя ведет, чем оригинальная версия. Он по-прежнему имеет крошечную утечку времени выполнения, поэтому программа может создавать проблемы, если она работает в течение нескольких недель.

Теперь предположим, что программа может быть переписана, поэтому потребление памяти навсегда ограничено некоторым разумным пределом. Эта ограниченность во времени является, пожалуй, более важной функцией, чем освобождение всей выделенной памяти по времени завершения. Доказательство этой ограниченности времени выполнения сложно. Тестирование того, что вся выделенная память освобождается к моменту завершения программы, намного проще. Коммерческие инструменты, как правило, сосредоточены на последнем для проверки утечки.