Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Утечки памяти, Как засечь ? 
:(
    Опции темы
Sheff
Дата 31.8.2002, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: 3
Всего: 3



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


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 1.9.2002, 03:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



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

GlobalAlloc
GlobalFree
GlobalSize

HeapCreate
HeapDestroy
HeapAlloc
HeapFree
HeapReAlloc
HeapSize

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


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Sheff
Дата 1.9.2002, 05:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: 3
Всего: 3



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

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


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 1.9.2002, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



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


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Sheff
Дата 1.9.2002, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 503
Регистрация: 25.3.2002
Где: Зеленоград

Репутация: 3
Всего: 3



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

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


--------------------
--------------------------
Шеф всегда прав :)
PM MAIL WWW ICQ   Вверх
Seregy
Дата 2.9.2002, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 30.7.2002

Репутация: нет
Всего: нет



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


Хороший стиль програмирования...
PM MAIL   Вверх
Fantasist
Дата 3.9.2002, 03:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



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

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


--------------------
Волны гасят ветер...
PM MAIL   Вверх
suborg
Дата 3.9.2002, 05:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.4.2002
Где: Москва

Репутация: нет
Всего: нет



А вот как поймать-то утечку случайную...
В VC после завершения работы debug компиляции расписываются утечки, но по-моему не все. Особенно что касается COM. На сколько я знаю, есть продукт Rational, который сильно помогает ловить эту багу. Но какой... где его взять, сколько весит и т.п. Интересно было бы узнать.
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 3.9.2002, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



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


--------------------
Волны гасят ветер...
PM MAIL   Вверх
suborg
Дата 3.9.2002, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.4.2002
Где: Москва

Репутация: нет
Всего: нет



По-моему опять не всегда сработает перегрузка потому что например strdup выделяет область памяти, хотя ты никаких new не делаешь. Не надёжно.
PM MAIL WWW ICQ   Вверх
podval
Дата 3.9.2002, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: 1
Всего: 62



Если надо, могу слить на е-мейл LogClient. Он умеет следить за тем, что использует прога. Там надо подключить к проекту *.lib и использовать нужные функции. Сделан на VС++. Кто владеет, разберется в прилагаемых исходниках.
Архив около 126К.
PM WWW ICQ   Вверх
suborg
Дата 3.9.2002, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 29.4.2002
Где: Москва

Репутация: нет
Всего: нет



а что значит "использовать нужные функции"?
PM MAIL WWW ICQ   Вверх
Fantasist
Дата 4.9.2002, 03:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



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

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


--------------------
Волны гасят ветер...
PM MAIL   Вверх
podval
Дата 4.9.2002, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: 1
Всего: 62



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

Они в заголовочниках расписаны
PM WWW ICQ   Вверх
Sergei
  Дата 4.9.2002, 19:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ребята, есть уникальная программа BoundsChecker Visual C++ Edition v6.51 она вам все утечки памяти отловит и еще много всего.
  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0689 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.