![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| S.A.G. |
|
|||
![]() не эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1339 Регистрация: 20.7.2006 Где: in ad equate Репутация: нет Всего: 19 |
Есть прога, она юзает объекты и др. пользовательские струтуры хранящиеся в куче. Как определить все ли они удаляються после завершения работы проги т.е. как определить факт утечки памяти?
-------------------- Вот она задачка: спасти себя от себя самого © Cube Sometimes good people do evil things © A Simple Plan |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 4 Всего: 260 |
располагаются в адресном пространстве процесса. Если в твоем случае приложение == программа == процесс, то после завершения процесса(программы) вся выделенная ей память(в т.ч. "heap" - "куча") будет возвращена ОС. Т.о. "глобальной" утечки памяти быть не может(разве что ты внедрялся в чужое адресное пространство и "гадил" там - в том же explorer.exe или ещё где... но, видимо, в твоем случае такого не было). А утечка есть только в пределах твоего процесса. С другой стороны, если твое приложение сожрет всю доступную адресуемую память, то ничего хорошего в этом не будет, хоть память и освободится с закрытием твоего приложения... так что проверять надо. На это дело есть модуль MemCheck |
|||
|
||||
| S.A.G. |
|
|||
![]() не эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1339 Регистрация: 20.7.2006 Где: in ad equate Репутация: нет Всего: 19 |
Ну если используються связные списки.. никаких левых наворотов. Если память в любом случае освобождаеться то зачем ее освобождать явно?
-------------------- Вот она задачка: спасти себя от себя самого © Cube Sometimes good people do evil things © A Simple Plan |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 4 Всего: 260 |
если ты никогда-никогда не задействуешь свой класс в программе, где объекты такого класса будут создаваться/уничтожаться пачками - не пиши особождение памяти в деструкторе. если твой класс гарантированно(хотел бы знать того, кто дает такие гарантии) будет использоваться в приложении только в виде единственного экземпляра на протяжении всей работы и максимально занимает 1-2 Кб памяти - не ищи утечки. НО! Если ты можешь предсказать такие условия работы своего класса/приложения, то ты - бог если тебе так неохота чистить за собой память, что ты против соблюдения правил приличия(вдруг твой класс/функцию/код будет использовать кто посторонний?) и даже просто здравого смысла(если у тебя в цикле создаются объекты, скажем, в количестве 1000000 штук и каждый вызывает утечку памяти на мегабайт, может случиться out of memory) - то пользуй лучше другие языки, среда которых подразумевает автоматизированную сборку мусора(Java, .Net - группа, реализации языков функционального программирования), либо используй smart pointers вместо "обычных" указателей. |
|||
|
||||
| S.A.G. |
|
|||
![]() не эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1339 Регистрация: 20.7.2006 Где: in ad equate Репутация: нет Всего: 19 |
У меня в объекте есть поля которые являються указателями на списки разных размеров. Списки эти не слишком большие и я хотел бы проверить все ли они хорошо убиваються в деструкторе. Как вижу убивать их необязательно... :( Столько сил и мозгов угрохал чтобы написать вродебы корректное удаление. Хотелось бы чтобы это было действительно так.
-------------------- Вот она задачка: спасти себя от себя самого © Cube Sometimes good people do evil things © A Simple Plan |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 4 Всего: 260 |
||||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
-------------------- There are always someone smarter than you... |
|||
|
||||
| Yanis |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2937 Регистрация: 9.2.2004 Где: Москва Репутация: 72 Всего: 111 |
Это auto_ptr в С++. Не знаю насколько это удобно и возможно в Delphi |
|||
|
||||
| S.A.G. |
|
|||
![]() не эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1339 Регистрация: 20.7.2006 Где: in ad equate Репутация: нет Всего: 19 |
Почти -------------------- Вот она задачка: спасти себя от себя самого © Cube Sometimes good people do evil things © A Simple Plan |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 4 Всего: 260 |
черт! я просто на С++ в то время писал.... Значит, другой совет: наследуй классы не от TObject, а от TInterfacedObject - как я понимаю, даже без внедрения интерфейсов там реализован механизм подсчета ссылок и когда на область памяти(объект) больше никто не ссылается, объект уничтожается автоматически. Добавлено через 54 секунды а вообще - хватит лениться и вперед - писать деструкторы! |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Нет что-то путаешь, такое есть только для строк и динамических массивов. Даже себе не представляю как можно в Delphi сделать auto_ptr... ведь тут нет перегрузки, хотя что-то в 2007 уже есть. Но как определить что указатель уничтожен? На счет интерфейсов, так счетчик ссылок работает только у интерфейса. Это если создать объект как интерфейс... и то интерфейс нужно занулить, чтобы уничтожить ссылку, пока этого не будет сделано ничего не произойдет. А если указатель создан в стеке, то по выходу из процедуры никто не заботится чтобы занулять область памяти стековых переменных, просто смещают указатель стека и все. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 4 Всего: 260 |
||||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |