Способы избежать утечек памяти в C / C ++ - PullRequest
11 голосов
/ 06 июня 2010

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

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

Ответы [ 6 ]

10 голосов
/ 06 июня 2010

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

Во-первых, не создает утечек памяти . Методы защитного программирования здесь неоценимы. См. превосходную презентацию для краткого изложения этих проблем или соответствующую главу в Secure C Coding . Я больше знаком с С, чем с С ++, но понимаю, что умные указатели С 1010 * здесь полезны.

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

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

7 голосов
/ 06 июня 2010

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

2 голосов
/ 06 июня 2010

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

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

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

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

2 голосов
/ 06 июня 2010

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

Для первого, упомянутого выше valgrind или набора инструментов IBM Rational, если у вас есть лицензия на это. Доктор Доббс рекомендовал BoundsChecker от CompuWare, но это было в 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

1 голос
/ 06 июня 2010

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

0 голосов
/ 06 июня 2010

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

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