|
|
Регистрация Восстановить пароль |
Повторная активизация 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, 00:28 | #2 |
Подтвердите свой е-майл
Регистрация: 29.08.2012
Сообщений: 4,011
|
в диспетчер задач смотреть не надо, и все ок.
|
17.04.2013, 00:30 | #3 |
МегаМодератор
СуперМодератор
Регистрация: 09.11.2010
Сообщений: 7,291
|
Написал так:
Код:
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
|
17.04.2013, 00:31 | #4 |
Форумчанин
Регистрация: 16.03.2013
Сообщений: 599
|
Вроде освобождение динамических массивов не так происходит? нет?
UPD: Ладно, я не прав) UPD2: Все таки вот эту строку я и ждал: "setlength(N, 0);"
alextrof94$gmail.com
Последний раз редактировалось alextrof94; 17.04.2013 в 00:33. |
17.04.2013, 00:49 | #5 | |
Форумчанин
Регистрация: 18.10.2010
Сообщений: 419
|
Цитата:
а куда тогда смотреть? как узнать сколько места программа занимает? alextrof94, виноват =) сообщение для форума я писал заново, а не копипастил из проги. а там SetLength(N,0) у меня конечно же был, но даже если бы его и не было, N - это массив указателей по сути, каждый из них весит 4 байта. чтобы такой массив занимал 4 метра, его длина должна быть 1 000 000, т.е. 4 байта х 1 000 000 Кстати, есть какой-нибудь предел количества создаваемых компонентов? хотя я уже натыкался на сообщение типа "вы израсходовали все разрешения системы..." как-то так, поэтому точнее спросить - от чего они зависят? Последний раз редактировалось xrob; 17.04.2013 в 00:53. |
|
17.04.2013, 00:54 | #6 |
Форумчанин
Регистрация: 16.03.2013
Сообщений: 599
|
Еще можно попробовать заюзать freeandnil(N[i]), может он полностью освободит память, но как было сказано выше, программа по завершении все равно все освободит.
alextrof94$gmail.com
|
17.04.2013, 01:13 | #7 | |
Подтвердите свой е-майл
Регистрация: 29.08.2012
Сообщений: 4,011
|
Цитата:
|
|
17.04.2013, 01:13 | #8 |
Подтвердите свой е-майл
Регистрация: 29.08.2012
Сообщений: 4,011
|
тут като была тема про то сколько калькуляторов можно стартонуть сразу
|
17.04.2013, 19:31 | #9 | |||
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
Цитата:
НИкогда так не делайте. SetLength - "тяжелая" операция, ее нцужно выносить из цикла. Вы умудрились написать код так, что он вместо ~10000 операций совершает ~100000000. Цитата:
Цитата:
Вот, скажем, идете Вы по улице и видите дом с табличкой "ул. Ленина 39". - Ага, - думаете Вы, - 39 - это высота здания в метрах. А потом оказывается, что высота - всекго 18 метров. Выходит, табличка врет? Диспетчер задач показывает все правильно, но совсем не то, что Вы хотите. |
|||
17.04.2013, 22:02 | #10 | |
Форумчанин
Регистрация: 18.10.2010
Сообщений: 419
|
s-andriano, если уж изволите проводить аналогию с домом,
то более похоже это выглядело бы так: вот скажем иду я по улице и вижу дом с табличкой "высота 20", и видя это я могу совершенно закономерно подумать, что это высота дома 20 м. а на самом деле табличка имела в виду что это высота потолков в доме 20 м. но в общем я вас понял: диспетчер показывает сколько памяти винда предоставляет программе, а не сколько программа реально занимает. Цитата:
хотя с тем что он не рационален спорить не буду... просто раньше я никогда не задумывался о таких простых операциях как SetLength, но по ходу не так она и проста... Как она работает? Перекладывает ВЕСЬ массив на новое место? |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
проблемы освобождения ресурсов | xrob | Общие вопросы Delphi | 2 | 17.04.2013 02:40 |
Процедурой освобождения памяти на 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 |