Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2013, 00:13   #1
xrob
Форумчанин
 
Регистрация: 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?

Заранее спасибо! =)
xrob вне форума Ответить с цитированием
Старый 17.04.2013, 01:35   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у вас неверное представление о менагере кучи, он оставляет часть страниц зарезервированными, чтоб не резервировать потом.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.04.2013, 02:40   #3
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

опа, нифига!
у меня руки от злости дрожжали, когда тему создавал,
поэтому случайно 2 раза щелкнул по кнопке "отправить"...
я че-то не подумал что ваш форум обработает оба нажатия...
эту тему можно удалить - она создана случайно.

кстати, Пепел Феникса, BDA в соседней теме более доходчиво объяснил про менеджер памяти (кучи? )
вас я бы не понял.

Последний раз редактировалось xrob; 17.04.2013 в 02:46.
xrob вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функции для выделения, перераспределения и освобождения памяти 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