| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
Ты уверен, я если так: new char[10000...] и без delete'а ? |
| Автор: Fantasist 1.9.2002, 06:44 |
| Конечно. Все адресное пространство твоего процесса будет освобожденно. А как по твоему виндос закрывает не отвечающие программы. |
| Автор: Sheff 1.9.2002, 20:31 | ||
А тогда зачем люди в программах на обработчиках сообщений WM_CLOSE, WM_QUIT и т.д пишут delete,delete,delete... |
| Автор: Seregy 2.9.2002, 23:28 | ||
Хороший стиль програмирования... |
| Автор: Fantasist 3.9.2002, 03:50 | ||
Точно. К тому же 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 | ||
Да. strdub() использует malloc() для выделения памяти. Обе эти функции, как и ряд подобных, остались как наследие от С, и в программах на С++ очень реккомедую их не использовать. Для этого существую классы. |
| Автор: podval 4.9.2002, 17:24 | ||
Они в заголовочниках расписаны |
| Автор: Sergei 4.9.2002, 19:24 |
| Ребята, есть уникальная программа BoundsChecker Visual C++ Edition v6.51 она вам все утечки памяти отловит и еще много всего. |
| Автор: Rimas 5.9.2002, 15:37 | ||
Полностью согласен, сам ее юзаю, классная штука. Покажет все что есть. |
| Автор: suborg 5.9.2002, 18:34 |
| Полез, почитал про неё - видимо в самом деле вещь рулезнейшая. Встал вопрос, где её скачать. Поиски дали только одну ссылку, да и ту мёртвую, на нумеге я чего-то не догнал, как именно её выкачать, и можно ли вообще. Может есть информация? |