Добрый день.
Проблема заключается в следующем:
при работе программы постоянно создаются и удаляются объекты.
но после их удаления память от них (по показаниям task maanger'а) не освобождается. Память растет-растет, система начинает ругаться на нехватку виртуальной памяти, и программа может накрыться. помогает только сворачивание окна, после чего лишняя память сразу освобождается
Можно ли как-нибудь заставить систему принудительно освобождать память?
Здравствуйте, akvakh, Вы писали:
A>но после их удаления память от них (по показаниям task maanger'а) не освобождается. Память растет-растет, система начинает ругаться на нехватку виртуальной памяти, и программа может накрыться. помогает только сворачивание окна, после чего лишняя память сразу освобождается
Как-то все у вас загадочно-загадочно...
Чего за объекты? Как создаются? Как удаляются? Желательно на разговорном C++.
HgLab: Mercurial Server and Repository Management for Windows
Здравствуйте, akvakh, Вы писали:
A>Добрый день. A>Проблема заключается в следующем: A>при работе программы постоянно создаются и удаляются объекты. A>но после их удаления память от них (по показаниям task maanger'а) не освобождается. Память растет-растет, система начинает ругаться на нехватку виртуальной памяти, и программа может накрыться. помогает только сворачивание окна, после чего лишняя память сразу освобождается A>Можно ли как-нибудь заставить систему принудительно освобождать память?
Просмотри что бы для каждого выделения памяти под объект , после использования шло ее высвобождение .
Например — для new — delete; для new [] — delete [] .
Здравствуйте, akvakh, Вы писали:
A>Добрый день. A>Проблема заключается в следующем: A>при работе программы постоянно создаются и удаляются объекты. A>но после их удаления память от них (по показаниям task maanger'а) не освобождается. Память растет-растет, система начинает ругаться на нехватку виртуальной памяти, и программа может накрыться. помогает только сворачивание окна, после чего лишняя память сразу освобождается A>Можно ли как-нибудь заставить систему принудительно освобождать память?
Можно предложить поотлаживаться под BoundsChecker'ом.
Посмотришь, где у тебя утечки.
Причиной могут быть как ошибки в программе, так и неправильно слинкованные CRT. (Проверь это в первую очередь: если есть несколько DLL, разделяющих объекты между собой — они все должны использовать одинаковую CRT DLL — а не статическую).
Перекуём баги на фичи!
Re: освобождение памяти
От:
Аноним
Дата:
28.04.05 18:37
Оценка:
Здравствуйте, akvakh, Вы писали:
A>Добрый день. A>Проблема заключается в следующем: A>при работе программы постоянно создаются и удаляются объекты. A>но после их удаления память от них (по показаниям task maanger'а) не освобождается. Память растет-растет, система начинает ругаться на нехватку виртуальной памяти, и программа может накрыться. помогает только сворачивание окна, после чего лишняя память сразу освобождается A>Можно ли как-нибудь заставить систему принудительно освобождать память?
Это называется memory leak
Не ты первый и не ты последний с такой проблемой.
BoundsChecker тебе может помочь.
Здравствуйте, akvakh, Вы писали:
A>Добрый день. A>Проблема заключается в следующем: A>при работе программы постоянно создаются и удаляются объекты. A>но после их удаления память от них (по показаниям task maanger'а) не освобождается. Память растет-растет, система начинает ругаться на нехватку виртуальной памяти, и программа может накрыться. помогает только сворачивание окна, после чего лишняя память сразу освобождается A>Можно ли как-нибудь заставить систему принудительно освобождать память?
Нечто подобное я наблюдал при использовании MFC. Методы вроде FromHandle создают временные объекты, которые уничтожаются в OnIdle. Последний блокируется при открытии модального диалога.
Нет ничего более постоянного, чем временное...
А еще я бы попытался выяснить, какого типа объекты накапливаются, если у блоков памяти что-то общее (например, одинаковый размер или ссылка на таллицу виртуальных методов).
Здравствуйте, SeRya, Вы писали:
SR>Нечто подобное я наблюдал при использовании MFC. Методы вроде FromHandle создают временные объекты, которые уничтожаются в OnIdle. Последний блокируется при открытии модального диалога.
Ну так ведь он разблокируется по закрытию диалога.
Хотя... Если программа — это MFC Dialog-based, то именно такое поведение и произойдёт.
Как-то этот кэш можно сбросить. MSDN почитать...
Но с другой стороны, а что это за прога, которая интенсивно терзает всё время разные хэндлы окон и GDI?
Может быть, и в этой части есть утечка.
Здравствуйте, akvakh, Вы писали:
A>Добрый день. A>Проблема заключается в следующем: A>при работе программы постоянно создаются и удаляются объекты. A>но после их удаления память от них (по показаниям task maanger'а) не освобождается. Память растет-растет, система начинает ругаться на нехватку виртуальной памяти, и программа может накрыться. помогает только сворачивание окна, после чего лишняя память сразу освобождается A>Можно ли как-нибудь заставить систему принудительно освобождать память?
STL используешь?
Вообще, неплохо бы код показать
... <<А писал я весь этот бред на RSDN@Home 1.1.4 beta 5 rev. 411, под звуки Unknown — Track 3 >>
Здравствуйте, Аноним, Вы писали:
А>Это называется memory leak А>Не ты первый и не ты последний с такой проблемой. А>BoundsChecker тебе может помочь.
А>А вообще на чем пишешь то? А>На С++ хоть?
пишу-то на C++. и по-моему это не совсем memory leak, по-моему leak — это когда память утекает с концами, а тут проблема в другом — память освобождается только при сворачивании окна, а пока окно активно — нет.
Re[3]: освобождение памяти
От:
Аноним
Дата:
30.04.05 22:49
Оценка:
Здравствуйте, akvakh, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>Это называется memory leak А>>Не ты первый и не ты последний с такой проблемой. А>>BoundsChecker тебе может помочь.
А>>А вообще на чем пишешь то? А>>На С++ хоть?
A>пишу-то на C++. и по-моему это не совсем memory leak, по-моему leak — это когда память утекает с концами, а тут проблема в другом — память освобождается только при сворачивании окна, а пока окно активно — нет.
С концами она никогда не утекает.
Даже в худшем случае можно завершить программу и винда за тобой все подчистит.
С этой точки зрения для пользователя это будет тем же самым,
как и принудильное сворачивание/разворачивание окна.
А что ты делаешь, кода окно сворачивается?
В общем нужны детали твоего кода, чтобы что-то посоветовать.
Ну и с BoundsChecker тоже стоит прогнать, если есть такая возможность.