Способы избежать Утечек памяти в C/C++

Каковы некоторые подсказки, которые я могу использовать для предотвращения утечек памяти в моих приложениях? В моем текущем проекте я использую инструмент "INSURE ++", который находит утечку памяти, и генерируйте отчет.

Кроме инструмента там любой метод, чтобы определить утечки памяти и преодолеть его.

11
задан Ankur 6 June 2010 в 05:34
поделиться

6 ответов

Есть три основных способа сделать это.

Первый - не создавать утечек памяти в первую очередь. Здесь неоценимую помощь оказывают методы защитного программирования. См. эту отличную презентацию для краткого изложения этих вопросов или соответствующую главу в Безопасном кодировании. Я больше знаком с C, чем с C++, но понимаю, что умные указатели C++ здесь полезны.

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

Третий подход заключается в обнаружении утечек памяти во время выполнения, как это делает INSURE++. Valgrind отлично подходит для этого и настоятельно рекомендуется. Он может помочь отловить ошибки, которые вы уже ввели. Это особенно полезно, если у вас есть набор тестов с хорошим покрытием кода.

10
ответ дан 3 December 2019 в 05:11
поделиться

Интеллектуальные указатели могут быть очень полезны в автоматизации учета времени жизни объектов:

http://ootips.org/yonat/4dev/smart-pointers.html

Там, где это возможно, используйте выделенные стеком объекты внутри соответствующих областей вместо new / delete.

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

2
ответ дан 3 December 2019 в 05:11
поделиться

Используйте интеллектуальный указатель, например std :: shared_ptr (C ++ 0x), std :: tr1 :: shared_ptr (TR1) или boost :: shared_ptr . Конечно, это решение работает только с C ++ - вы сами в C.

1
ответ дан 3 December 2019 в 05:11
поделиться

Для 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. И так далее. Когда утечка обнаружена таким образом, вы можете быстро сузить ее.

7
ответ дан 3 December 2019 в 05:11
поделиться

Мы говорим об инструментах для поиска утечек или способах кодирования для их предотвращения?

Для первого - вышеупомянутый 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

2
ответ дан 3 December 2019 в 05:11
поделиться

Избежать или обнаружить? Чтобы избежать, сначала определите и попытайтесь понять, где и почему ... Другим способом может быть использование библиотеки GC, такой как описанная здесь , но могут существовать и другие (возможно, лучшие) библиотеки.

0
ответ дан 3 December 2019 в 05:11
поделиться