Каковы некоторые подсказки, которые я могу использовать для предотвращения утечек памяти в моих приложениях? В моем текущем проекте я использую инструмент "INSURE ++", который находит утечку памяти, и генерируйте отчет.
Кроме инструмента там любой метод, чтобы определить утечки памяти и преодолеть его.
Есть три основных способа сделать это.
Первый - не создавать утечек памяти в первую очередь. Здесь неоценимую помощь оказывают методы защитного программирования. См. эту отличную презентацию для краткого изложения этих вопросов или соответствующую главу в Безопасном кодировании. Я больше знаком с C, чем с C++, но понимаю, что умные указатели C++ здесь полезны.
Второй подход статический анализ, который пытается обнаружить ошибки в вашем исходном коде. Оригинальным инструментом в этой категории является lint, который сейчас, к сожалению, устарел. Лучшие инструменты, насколько я знаю, коммерческие, такие как coverty. Однако существуют и некоторые бесплатные инструменты.
Третий подход заключается в обнаружении утечек памяти во время выполнения, как это делает INSURE++. Valgrind отлично подходит для этого и настоятельно рекомендуется. Он может помочь отловить ошибки, которые вы уже ввели. Это особенно полезно, если у вас есть набор тестов с хорошим покрытием кода.
Интеллектуальные указатели могут быть очень полезны в автоматизации учета времени жизни объектов:
http://ootips.org/yonat/4dev/smart-pointers.html
Там, где это возможно, используйте выделенные стеком объекты внутри соответствующих областей вместо new / delete.
Такие инструменты, как valgrind, имеют некоторые накладные расходы и могут замедлить вашу работу. Если вы знаете свою кодовую базу и типы утечек, которые имеют тенденцию возникать, вы можете настроить таргетинг на определенные классы и реализовать более легкие проверки веса (даже простой счетчик объектов, который вы сравниваете с нулем при выходе). Затем эти легкие проверки можно использовать, чтобы побудить вас к более обширному сеансу отладки valgrind при их запуске.
Используйте интеллектуальный указатель, например std :: shared_ptr
(C ++ 0x), std :: tr1 :: shared_ptr
(TR1) или boost :: shared_ptr
. Конечно, это решение работает только с C ++ - вы сами в C.
Для C помогает хорошая организация кода. Т.е. не бросайте вызовы malloc () и free () по всей кодовой базе. Объедините их в две функции, тогда у вас будет одна точка для всех проверок. Самым простым может быть подсчет успешных вызовов и проверка при выходе из программы, что они сбалансированы.
static unsigned long mymem_count_alloc = 0;
static unsigned long mymem_count_free = 0;
void *mymem_alloc (size_t size)
{
void *p;
p = malloc(size);
if (p)
{
mymem_count_alloc++;
}
else
error logging/handling/signaling
return (p);
}
void mymem_free (void *p)
{
if (p)
{
free(p);
mymem_count_free++;
}
}
void mymem_check (void)
{
if (mymem_count_alloc != mymem_count_free)
error alert
}
Вы можете продолжить это для различных структур данных. Везде, где вам нужно выделить память для строки, используйте mystr_alloc и mystr_free. И так далее. Когда утечка обнаружена таким образом, вы можете быстро сузить ее.
Мы говорим об инструментах для поиска утечек или способах кодирования для их предотвращения?
Для первого - вышеупомянутый valgrind или набор инструментов IBM Rational, если у вас есть лицензия на что. Доктор Доббс рекомендовал CompuWare's BoundsChecker, но это было в 2002 году.
Что касается более позднего, см .:
Идиома C ++ для предотвращения утечек памяти?
http://www.cprogramming.com/tutorial/memory_debugging_parallel_inspector.html
] http://scottmcpeak.com/memory-errors/
http://www.yolinux.com/TUTORIALS/C++MemoryCorruptionAndMemoryLeaks.html
Избежать или обнаружить? Чтобы избежать, сначала определите и попытайтесь понять, где и почему ... Другим способом может быть использование библиотеки GC, такой как описанная здесь , но могут существовать и другие (возможно, лучшие) библиотеки.