|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
17.04.2013, 00:13 | #1 |
Форумчанин
Регистрация: 18.10.2010
Сообщений: 419
|
проблемы освобождения ресурсов
Часть1:
Спасайте! Мир перевернулся вверх дном! вот скажите мне пожалуйста, что в этом мире не так?? я всегда считал что Create - это создание объекта, а именно - выделение необходимого количества памяти под объект, а Destroy - наоборот, уничтожение объекта, его еще называют "освобождение ресурсов". т.е. это освобождение памяти, т.е. если занимал компонент 100 байт памяти, то после его удаления, он должен занимать 0 байт памяти, разве нет? при этом, все попытки обращения к удаленному объекту должны заканчиваться в Access Violation - ведь даже если ссылка осталась - объекта то уже НЕТ, память очищена! Часть2: и вот что я делаю: берем обычный TPanel, берем массив N:array of TPanel, и по кнопке1 создаем 10000 панелек: for i:=0 to 10000 do // 10001, но это не суть. begin d:=Length(N); SetLength(N,d+1); N[d]:=TPanel.Create(self); end; //поправьте, если я ошибаюсь, но по-моему с циклом все правильно. а по кнопке2 удаляем все панельки: for i:=0 to Length(N)-1 do N[i].Free; // по-моему тоже все предельно просто и ошибиться здесь негде... Часть3: теперь, исходя из логики, описанной в Части1, если мы нажмем кнопку1, а потом кнопку2, то количество памяти, занимаемое программой не изменится. Поправьте, если я ошибаюсь. НО! Запускаем проект, смотрим в диспетчере задач (Alt+Ctrl+Del) сколько памяти занимает программа - у меня ~3.5 mb Теперь жмем кнопку1 (создаем 10000 панелек) память потихоньку растет, у меня дошло до ~14 mb и остановилось Теперь жмем кнопку2 (удаляем все панельки) память сокращается только до ~8 mb, хотя по логике она должна вернуться к ~3.5 mb (мы ведь удалили все что создали) теперь меня мучает вопрос: что не так? что занимает дополнительные ~4.5 mb? Заранее спасибо! =) |
17.04.2013, 01:35 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
у вас неверное представление о менагере кучи, он оставляет часть страниц зарезервированными, чтоб не резервировать потом.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
17.04.2013, 02:40 | #3 |
Форумчанин
Регистрация: 18.10.2010
Сообщений: 419
|
опа, нифига!
у меня руки от злости дрожжали, когда тему создавал, поэтому случайно 2 раза щелкнул по кнопке "отправить"... я че-то не подумал что ваш форум обработает оба нажатия... эту тему можно удалить - она создана случайно. кстати, Пепел Феникса, BDA в соседней теме более доходчиво объяснил про менеджер памяти (кучи? ) вас я бы не понял. Последний раз редактировалось xrob; 17.04.2013 в 02:46. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Функции для выделения, перераспределения и освобождения памяти | ArtGrek | Общие вопросы Delphi | 9 | 14.03.2011 03:08 |
Процедурой освобождения памяти на assembler | t2skler | Общие вопросы Delphi | 1 | 10.02.2011 13:52 |
Проблема освобождения файла в DSPAck | PIKACHU | Мультимедиа в Delphi | 11 | 04.12.2009 17:13 |
Проблема освобождения ресурсов при работе с COM (IHTMLDocument2) | Антон Ю.Б. | Общие вопросы Delphi | 0 | 27.07.2009 17:34 |
Проблемы с добавлением ресурсов?? | HunterMan | Win Api | 4 | 12.06.2008 02:33 |