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


Автор: Sheff 31.8.2002, 21:26
Допустим у меня есть прога, которая даёт утечку памяти. Можно ли как-то отследить сколько памяти не освободилось по окончанию программы(можно сравнивать с моментом перед запуском) ?

Автор: Fantasist 1.9.2002, 03:52
По окончанию программы освободиться вся память.  :)
Однако, определить сколько ты памяти в данный момент занял можно.
Первое, можно использовать GlobalMemoryStatus, которое расскажет информацию о памяти, но SDK утверждает, что эта информация может измениться, даже если твое приложение ничего не сделало. Так что на этот вариант лучше не расчитывать. Второе, можно работать с памятью через такие API:

GlobalAlloc
GlobalFree
GlobalSize

HeapCreate
HeapDestroy
HeapAlloc
HeapFree
HeapReAlloc
HeapSize

и т.п. Ну и самый С++-шный способ: перегрузка глобальных new,delete. Тут правда надо думать о тех, кто вдруг захочет использовать твой код. Это, конечно не единственный С++-шный способ, но самый простой.

Автор: Sheff 1.9.2002, 05:41
Цитата(Fantasist @ 31.8.2002, 20:52)
По окончанию программы освободиться вся память.  :)

Ты уверен, я если так:
new char[10000...] и без delete'а ?

Автор: Fantasist 1.9.2002, 06:44
Конечно. Все адресное пространство твоего процесса будет освобожденно. А как по твоему виндос закрывает не отвечающие программы.

Автор: Sheff 1.9.2002, 20:31
Цитата(Fantasist @ 31.8.2002, 23:44)
Конечно. Все адресное пространство твоего процесса будет освобожденно. А как по твоему виндос закрывает не отвечающие программы.

А тогда зачем люди в программах на обработчиках сообщений WM_CLOSE, WM_QUIT и т.д пишут delete,delete,delete...

Автор: Seregy 2.9.2002, 23:28
Цитата
Sheff Дата сообщения: 01.9.2002,13:31
А тогда зачем люди в программах на обработчиках сообщений WM_CLOSE, WM_QUIT и т.д пишут delete,delete,delete...


Хороший стиль програмирования...

Автор: Fantasist 3.9.2002, 03:50
Цитата(Seregy @ 02.9.2002, 16:28)
Хороший стиль програмирования...

Точно.
К тому же WM_CLOSE может относиться к закрытию какого-то окна(а не главного), которое опять же может быть открыто.

Автор: suborg 3.9.2002, 05:47
А вот как поймать-то утечку случайную...
В VC после завершения работы debug компиляции расписываются утечки, но по-моему не все. Особенно что касается COM. На сколько я знаю, есть продукт Rational, который сильно помогает ловить эту багу. Но какой... где его взять, сколько весит и т.п. Интересно было бы узнать.

Автор: Fantasist 3.9.2002, 09:09
Так вон я же куча способов привел. Я лично за то, чтобы перегрузить в DEBUG версии глобальные new/delete - самый простой путь узнать где ты чего не освободил.Стандартная библиотека VC так и делает, скорее всего, и имено так она тебе выдает информацию о memory leak. А если используешь объекты COM, то используй классы умных указателей(забыл как называются, надо глянуть) - специально для этого придумали. Это все, что ты можешь сделать с COM - не забыть нужное количество раз вызвать Release, все остальные утечки COM объекта, на совести COM объекта и ничего ты с этим сделать не сможешь.

Автор: suborg 3.9.2002, 19:50
По-моему опять не всегда сработает перегрузка потому что например strdup выделяет область памяти, хотя ты никаких new не делаешь. Не надёжно.

Автор: podval 3.9.2002, 22:48
Если надо, могу слить на е-мейл LogClient. Он умеет следить за тем, что использует прога. Там надо подключить к проекту *.lib и использовать нужные функции. Сделан на VС++. Кто владеет, разберется в прилагаемых исходниках.
Архив около 126К.

Автор: suborg 3.9.2002, 22:50
а что значит "использовать нужные функции"?

Автор: Fantasist 4.9.2002, 03:34
Цитата(suborg @ 03.9.2002, 12:50)
По-моему опять не всегда сработает перегрузка потому что например strdup выделяет область памяти, хотя ты никаких new не делаешь. Не надёжно.

Да. strdub() использует malloc() для выделения памяти. Обе эти функции, как и ряд подобных, остались как наследие от С, и в программах на С++ очень реккомедую их не использовать. Для этого существую классы.

Автор: podval 4.9.2002, 17:24
Цитата(suborg @ 03.9.2002, 15:50)
а что значит "использовать нужные функции"?

Они в заголовочниках расписаны

Автор: Sergei 4.9.2002, 19:24
Ребята, есть уникальная программа BoundsChecker Visual C++ Edition v6.51 она вам все утечки памяти отловит и еще много всего.

Автор: Rimas 5.9.2002, 15:37
Цитата(Guest @ 04.9.2002, 12:24)
Ребята, есть уникальная программа BoundsChecker Visual C++ Edition v6.51 она вам все утечки памяти отловит и еще много всего.

Полностью согласен, сам ее юзаю, классная штука. Покажет все что есть.

Автор: suborg 5.9.2002, 18:34
Полез, почитал про неё - видимо в самом деле вещь рулезнейшая. Встал вопрос, где её скачать. Поиски дали только одну ссылку, да и ту мёртвую, на нумеге я чего-то не догнал, как именно её выкачать, и можно ли вообще. Может есть информация?

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