Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Утечка памяти


Автор: NightGoblin 2.1.2004, 05:52
Всем привет.

Заранее прошу прощения, если вопрос из разряда RTFM&FAQ, но первого под рукой нет, а во втором ничего даже отдаленно напоминающего не нашлось.

Значит так. Написал на C (без плюсов) кое-какую библиотеку. И теперь охота проверить, нет ли при работе с ней утечек памяти. Вопрос: как это сделать стандартными средствами? Я пробовал через sbrk(), но он выводит разные результаты даже если все было аккуратно удалено, то есть, при любом раскладе после работы с malloc()/free() размер сегмента меняется. Какие есть средства для проверки подобных вещей, желательно по стандарту ANSI и/или POSIX?

Спасибо.

Автор: <Spawn> 2.1.2004, 06:29
Поищи BoundsChecker. Сам не пробовал его, но читал, что это одна из лучших прог для проверки утечек памяти.

Автор: Waters 2.1.2004, 19:58
http://www.rsdn.ru/article/vcpp/leaks.xml

wbr.

Автор: NightGoblin 2.1.2004, 21:36
<Spawn>, Waters,
Большое спасибо, но это, к сожалению, не то, что нужно. Разработка ведется в UNIX (компилятор GCC) на чистом C, без классов. Есть ли какие-то стандартные средства (или, если есть, библиотека, которая будет работать и в *NIX) для контроля таких вещей?

Автор: DENNN 5.1.2004, 10:23
Я бы еще попробовал поискать на sourceforge.net

Автор: Kefir 5.1.2004, 19:36
Сам не пользовался, но вроде в RedHat есть что-то навроде Memory Profiler...

Автор: Unregistered 6.1.2004, 14:05
Разные есть средства : mtrace, библиотека ccmalloc, библиотека Electric Fence. Все они есть в стандартной поставке.

Автор: mr.DUDA 6.1.2004, 16:05
В крайнем случае, имхо можно взять да и написать самостоятельно парочку макросов, типа:
Код
#define _DEBUG_MEM 1

void * malloc_dbg(size_t size)
{
  // ... какой-то свой код для слежения за размерами выделенной памяти
}

// ....     то же самое для free, realloc, calloc и т.п.

#ifdef _DEBUG_MEM
#define malloc _malloc_dbg
#define free _free_dbg
// ...
#endif

#include ...     // какие-то стандартные библиотеки

или же переопределить new_handler.

ЗЫ, в статье с RSDN.ru как раз описывается такой подход, но с упором на компиляторы под Win-платформу.

Автор: Unregistered 6.1.2004, 20:55
Утилита mtrace позволяет выявить наиболее распространенную ошибку при работе с динамической памятью: несоответствие числа операций выделения и освобождения памяти. Алгоритм применения утилиты таков:
1. Включить в программу файл <mcheck.h>. Эта функция активизирует трассировку операций выделения и освобождения памяти.
2. Задать имя файла, в котором будет сохраняться трассировачная информация. Это делается следующим образом :
Код
%export MALLOC_TRACE=memory.log

3. Запустить программу.
4. Вызвать mtrace:
Код
%mtrace my_program $MALLOC_TRACE

Автор: NightGoblin 10.1.2004, 06:26
Всем огромное спасибо. Думаю, вариант с mtrace или переопределением имен подойдет больше всего.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)