Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамический массив, не остается ли мусор? 
:(
    Опции темы
devmstr
Дата 11.6.2004, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: 2
Всего: 11



Если я создал динамический массив, то чистит ли Delphi память после окончания работы программы...


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
Петрович
Дата 11.6.2004, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Да. Более того, чистит не по окончанию программы, а тогда, когда переменная (динамический моссив) становится недоступной по области видимости. Т.е. например когда динамический массив в локальной переменной процедуры X, то память выделенная под него, освобождается автоматически при завершении процедуры X.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Guest
Дата 11.6.2004, 11:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо
  Вверх
x77
Дата 11.6.2004, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



Петрович , я всегда делал так:
Код
var
 m: array of string;
begin
 SetLength (m, 10);
 try
   ...
 finally
   Finalize (m);
 end;
end;



ты хочешь сказать, что освобождать память руками не надо в принципе? сказал, SetLength (m, 200000) и забыл?



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Cheba
Дата 11.6.2004, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: 1
Всего: 62



Цитата
чистит не по окончанию программы, а тогда, когда переменная (динамический моссив) становится недоступной по области видимости

А с екземплярами классов такое происходит?
PM MAIL ICQ   Вверх
x77
Дата 11.6.2004, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



Cheba, нет. при создании экземпляра класса указывается его владелец (owner). при уничтожении объекта он сам уничтожит все свои дочерние объекты. если вместо owner был указан nil, то уничтожать придётся руками, самому.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Она
Дата 11.6.2004, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 23.4.2004
Где: Москва

Репутация: нет
Всего: 2



Cheba , если под экземплярами классов ты понимаешь сам объектный код классов, а не объекты , породленные от того или иного класса, то как и с любым объектником выгрузка этого кода- проблема операционной системы. если же говорить говорить об объектах ( или экземплярах), то это либо проблема VCL, в случае, если ты не пораждаешь объекты динамически, или пользуешься только наследниками TComponent, причем не указываешь в качестве овнера nil.
Все объекты не порожденные от TComponent или объекты с неуказанным владельцем (nil)- твоя проблема.



--------------------
С уважением. Мария.
PM MAIL   Вверх
youri
Дата 12.6.2004, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



Цитата
Более того, чистит не по окончанию программы, а тогда, когда переменная (динамический моссив) становится недоступной по области видимости.

Да, по-моему, Петрович на Java перепрограммировал (всякие там сборщики мусора)

Цитата
ты хочешь сказать, что освобождать память руками не надо в принципе?

Я согласен, что надо, но я так понимаю при завершении программы Windows все равно вернет себе эту память?
PM   Вверх
_hunter
Дата 12.6.2004, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



вернуть то они вернут, но если приложение работает месяц и каждый час теряет по кило -- плохо окнам будет smile.gif


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
youri
Дата 12.6.2004, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



Полностью с тобой согласен (просто хотел уточнить)
PM   Вверх
Jey_k
Дата 13.6.2004, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WEB-командир
****


Профиль
Группа: Комодератор
Сообщений: 4149
Регистрация: 16.11.2003
Где: Москва

Репутация: 1
Всего: 61



Можно ограничить адресацию памяти программой


--------------------
PM MAIL WWW   Вверх
x77
Дата 13.6.2004, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



_hunter, нифига они не вернут. сделай GetMem (p, Size) и получишь классический memory leak при закрытии.

Jey_k, а она и так оганиченна программой, той памятью, которую для неё выделила ось. наоборот, приходить извращаться, чтобы адресовать память в чужом процессе.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Она
Дата 14.6.2004, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 399
Регистрация: 23.4.2004
Где: Москва

Репутация: нет
Всего: 2



Господа, начиная с пятой версии делфы , работает 24*365, и все при этом совершенно спокойно...
Сами понимаете проблема не в системе, и не в средстве. Гы smile.gif


Это сообщение отредактировал(а) Она - 14.6.2004, 01:00


--------------------
С уважением. Мария.
PM MAIL   Вверх
x77
Дата 14.6.2004, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



Она, не понял. что именно работает сов. спокойно?



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Jey_k
Дата 14.6.2004, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WEB-командир
****


Профиль
Группа: Комодератор
Сообщений: 4149
Регистрация: 16.11.2003
Где: Москва

Репутация: 1
Всего: 61



x77
Э-э батенька вы полуось с виндой не путайте



--------------------
PM MAIL WWW   Вверх
_hunter
Дата 14.6.2004, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



ага smile.gif :
Цитата
This function allocates a new memory block from OS/2, then adds it to the heap.  The allocation is performed by committing pages that have been previously allocated from the virtual address space but not committed. The block size is rounded up to the next multiple of 64K.  Virtual address space is allocated in multiples of 4 Meg, and committed in multiples of 64K.

+ IMHO пмять, выделенная под прогу с прогой и освободится ( если ее не выделить в другом процессе ( что аналогично ) )

Это сообщение отредактировал(а) _hunter - 14.6.2004, 19:12


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
youri
Дата 15.6.2004, 04:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



Цитата
которую для неё выделила ось

Цитата
This function allocates a new memory block from OS/2

Люди, а вы что про OS/2 говорите (когда я встретил первый фрагмент, а думал имеется в виду операционная система)?

PM   Вверх
x77
Дата 15.6.2004, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



я говорил именно про ось, а не про ось-пополам. а осью я называю любую операционку, сорри за неточности.

народ, мне уже интересно. т.е. если прога делает GetMem, New, GlobalAlloc и пр. всего один или несколько раз, не в цикле, и переполнения кучи гарантированно не произойдёт, то я могу смело не вызывать FreeMem и протчая?

т.е. я могу сделать GetMem (p, size), потом GetMem (p, size2), FreeMem (p, size2) и память, выделенная первым GetMem тоже будет освобождена при выходе из программы?


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
p0s0l
Дата 15.6.2004, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
Да, по-моему, Петрович на Java перепрограммировал (всякие там сборщики мусора)

Он сказал всё правильно. Дин. массивы (и дин. строки) автоуничтожаются.
Локальные - перед выходом из функции/процедуры.
Глобальные - при завершении работы программы (Finalization юнита).

Цитата
т.е. я могу сделать GetMem (p, size), потом GetMem (p, size2), FreeMem (p, size2) и память, выделенная первым GetMem тоже будет освобождена при выходе из программы?

Да. За этим следит менеджер памяти дельфинской проги. Каждый вызов GetMem запоминается, и при завершении проги вызывается процедура UninitAllocator, которая в цикле для каждого неосвобожденного GetMem'а вызывает VirtualFree...
Если же юзать VirtualAlloc или др. API вместо GetMem, то за освобождением памяти будет следить уже сама винда - при уничтожении процесса автоматически уничтожатся все выделенные процессу (уже ненужные) ресурсы, в т.ч. и память.

Наверняка многие видали игры, в которых если долго играть, начинаются тормоза, подгрузки. Это недосмотры программеров - memory leaks. Дело решается перезапуском игры, т.к. при закрытии игры винда сама "подчищает" за игрой.



--------------------
С уважением, г-н Посол.
PM   Вверх
x77
Дата 15.6.2004, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



круто. век живи, век учись.

p0s0l, с возвращением ;)


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Jey_k
Дата 15.6.2004, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WEB-командир
****


Профиль
Группа: Комодератор
Сообщений: 4149
Регистрация: 16.11.2003
Где: Москва

Репутация: 1
Всего: 61



Вообще лучше обнулять все выделенное ранее. Сколько раз сталкивался с тем что происходит наложение данных.


--------------------
PM MAIL WWW   Вверх
Cheba
Дата 15.6.2004, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: 1
Всего: 62



p0s0l, так что, memory leak в принципе не возможен, если не использовать хитрых методов отбирания памяти у других процессов?

PM MAIL ICQ   Вверх
x77
Дата 15.6.2004, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



смотря что понимать под утечкой. например, при щелчке на кнопку происходит считывание списка файлов текущего каталога в глобальный динамический массив. если юзер щёлкнул на кнопку пару раз и закрыл прогу - фиг с ним. а если прога непрерывно работает месяц? и юзер постоянно щёлкает? память не освобождается, т.е. ос будет по честному пытаться каждый раз выделить дополнительную память, когда она заканчивается. начинаются подкачки со свапа и т.д. вот об этом и говорил p0s0l. просто я был уверен, что вся эта память при закрытии проги так и останется заюзанной, в чём был неправ.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
p0s0l
Дата 16.6.2004, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
p0s0l, с возвращением ;)

Да не, я заглянул сюда когда выдалось время. У меня еще полсессии впереди. Каждый день вспоминаю о форуме, но воздерживаюсь (еле-еле) smile.gif

Цитата
p0s0l, так что, memory leak в принципе не возможен

Ну да. У процесса после его создания ничего не имеется, кроме одного потока и нескольких ресурсов. Для того, чтобы что-нибудь заиметь, процесс должен сделать запрос у ОС. ОС не дура - чтобы потом вернуть запрошенные ресуры обратно, запоминает "должок" процесса у себя. Этот факт подтверждает то, что имеются стандартные средства узнать, какие ресурсы (файлы, память, семафоры и др.) используют другие процессы (см. SysInternals) - это говорит о том, что винда запоминает всё, что кто-либо использует, в том числе и сама винда тоже.
Если процесс при завершении работы забыл что-то отдать обратно, ОС сама себе вернёт это принудительным образом... Конечно, она работает по определённым правилам (уничтожаются только ненужные никому ресурсы, т.е. если какой-либо ресурс юзают два процесса, то он уничтожится только после закрытия обоих процессов, или когда оба процесса его освободят), поэтому её можно обмануть. Например, открываем файл, делаем DuplicateHandle, причём процесс-приёмник будет какой-нибудь Explorer.exe (хотя нафиг сдался ему этот файл?). Теперь после закрытия проги файл останется всё равно открытым, а если он открыт эксклюзивно, никто его ни удалить, ни посмотреть даже не сможет. Теперь файл закроется, только если убить процесс explorer.exe.
Но это были файлы. А что если делаем так:
CreateFileMapping(INVALID_HANDLE_VALUE, ...., 128*1024*1024, 'MyMapping');
Потом делаем DuplicateHandle...
Теперь если прога закроется, то эти выделенные 128 метров памяти так и останутся висеть. Хэндл мы продублировали, хотя процессу, для которого мы дублировали хэндл нафиг этот файл-маппинг не нужен smile.gif.
Это, кстати, можно использовать в своих целях, если надо хранить какую-то инфу только в текущей сессии, и чтобы эта инфа не терялась после завершения нашей проги...


Это сообщение отредактировал(а) p0s0l - 16.6.2004, 20:58


--------------------
С уважением, г-н Посол.
PM   Вверх
Cheba
Дата 16.6.2004, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: 1
Всего: 62



p0s0l, спасибо. smile.gif
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0960 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.