![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: 3 Всего: 3 |
Допустим у меня есть прога, которая даёт утечку памяти. Можно ли как-то отследить сколько памяти не освободилось по окончанию программы(можно сравнивать с моментом перед запуском) ?
-------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
По окончанию программы освободиться вся память.
Однако, определить сколько ты памяти в данный момент занял можно. Первое, можно использовать GlobalMemoryStatus, которое расскажет информацию о памяти, но SDK утверждает, что эта информация может измениться, даже если твое приложение ничего не сделало. Так что на этот вариант лучше не расчитывать. Второе, можно работать с памятью через такие API: GlobalAlloc GlobalFree GlobalSize HeapCreate HeapDestroy HeapAlloc HeapFree HeapReAlloc HeapSize и т.п. Ну и самый С++-шный способ: перегрузка глобальных new,delete. Тут правда надо думать о тех, кто вдруг захочет использовать твой код. Это, конечно не единственный С++-шный способ, но самый простой. -------------------- Волны гасят ветер... |
|||
|
||||
| Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: 3 Всего: 3 |
Ты уверен, я если так: new char[10000...] и без delete'а ? -------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Конечно. Все адресное пространство твоего процесса будет освобожденно. А как по твоему виндос закрывает не отвечающие программы.
-------------------- Волны гасят ветер... |
|||
|
||||
| Sheff |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 503 Регистрация: 25.3.2002 Где: Зеленоград Репутация: 3 Всего: 3 |
А тогда зачем люди в программах на обработчиках сообщений WM_CLOSE, WM_QUIT и т.д пишут delete,delete,delete... -------------------- -------------------------- Шеф всегда прав :) |
|||
|
||||
| Seregy |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 30.7.2002 Репутация: нет Всего: нет |
Хороший стиль програмирования... |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Точно. К тому же WM_CLOSE может относиться к закрытию какого-то окна(а не главного), которое опять же может быть открыто. -------------------- Волны гасят ветер... |
|||
|
||||
| suborg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
А вот как поймать-то утечку случайную...
В VC после завершения работы debug компиляции расписываются утечки, но по-моему не все. Особенно что касается COM. На сколько я знаю, есть продукт Rational, который сильно помогает ловить эту багу. Но какой... где его взять, сколько весит и т.п. Интересно было бы узнать. |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Так вон я же куча способов привел. Я лично за то, чтобы перегрузить в DEBUG версии глобальные new/delete - самый простой путь узнать где ты чего не освободил.Стандартная библиотека VC так и делает, скорее всего, и имено так она тебе выдает информацию о memory leak. А если используешь объекты COM, то используй классы умных указателей(забыл как называются, надо глянуть) - специально для этого придумали. Это все, что ты можешь сделать с COM - не забыть нужное количество раз вызвать Release, все остальные утечки COM объекта, на совести COM объекта и ничего ты с этим сделать не сможешь.
-------------------- Волны гасят ветер... |
|||
|
||||
| suborg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
По-моему опять не всегда сработает перегрузка потому что например strdup выделяет область памяти, хотя ты никаких new не делаешь. Не надёжно.
|
|||
|
||||
| podval |
|
|||
![]() Где я? Кто я? ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3094 Регистрация: 25.3.2002 Где: СПб Репутация: 1 Всего: 62 |
Если надо, могу слить на е-мейл LogClient. Он умеет следить за тем, что использует прога. Там надо подключить к проекту *.lib и использовать нужные функции. Сделан на VС++. Кто владеет, разберется в прилагаемых исходниках.
Архив около 126К. |
|||
|
||||
| suborg |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 190 Регистрация: 29.4.2002 Где: Москва Репутация: нет Всего: нет |
а что значит "использовать нужные функции"?
|
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Да. strdub() использует malloc() для выделения памяти. Обе эти функции, как и ряд подобных, остались как наследие от С, и в программах на С++ очень реккомедую их не использовать. Для этого существую классы. -------------------- Волны гасят ветер... |
|||
|
||||
| podval |
|
|||
![]() Где я? Кто я? ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3094 Регистрация: 25.3.2002 Где: СПб Репутация: 1 Всего: 62 |
Они в заголовочниках расписаны |
|||
|
||||
| Sergei |
|
|||
|
Unregistered |
Ребята, есть уникальная программа BoundsChecker Visual C++ Edition v6.51 она вам все утечки памяти отловит и еще много всего.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |