Текущий архив: 2006.10.08;
Скачать: CL | DM;
ВнизБезопасное аварийное завершение приложения Найти похожие ветки
← →
DevilDevil © (2006-08-25 01:46) [0]При возникновении каких либо даже серьёзных ошибок в приложении из под Delphi, достаточно нажать Ctrl+F2, чтобы приложение закрылось, все деструкторы были выполнены (как мне кажется), не произошло утечек памяти. Существуют ли вообще такие методы (а в частности, является ли такой процедура Halt), позволяющие безопасно, без утечек ресурсов, завершающих приложение хотя бы из среды?
← →
guav © (2006-08-25 01:58) [1]> все деструкторы были выполнены (как мне кажется), не произошло
> утечек памяти.
ага. щаз.
_ничего_ не выполняется.
и не надо. так и задумано.
> является ли такой процедура Halt
нет.
Halt выполняет все финализации модулей и финализацию переменных с управляемым временем жизни, деструкторы автоматом не вызываются.
← →
guav © (2006-08-25 02:02) [2]> безопасно, без утечек ресурсов, завершающих приложение хотя
> бы из среды
Без утечек для приложения - нет, все ресурсы освобождать вручную.
Без утечек для ОС - любой, хоть Ctrl+F2, способ, вся память и ресурсы возвращаются ОС (ну кроме особых случаев типа объект в буфере обмена, который, естественно, останется там).
← →
Германн © (2006-08-25 02:07) [3]
> guav © (25.08.06 02:02) [2]
>
> > безопасно, без утечек ресурсов, завершающих приложение
> хотя
> > бы из среды
>
> Без утечек для приложения - нет, все ресурсы освобождать
> вручную.
Если приложение завершается, то о каких утечках идёт речь?
← →
guav © (2006-08-25 02:36) [4]> Если приложение завершается, то о каких утечках идёт речь?
О тех что например в MemProof отображаются. Я и говорю, что все ресурсы приложение вернёт, а куда оно денется, но обычно больше пользы от кода не имеющего утечек, т.к. его многократное выполнение не приведёт к перерасходу/исчерпанию ресурсов.
← →
Германн © (2006-08-25 02:55) [5]
> guav © (25.08.06 02:36) [4]
>
> > Если приложение завершается, то о каких утечках идёт речь?
>
>
> О тех что например в MemProof отображаются. Я и говорю,
> что все ресурсы приложение вернёт, а куда оно денется, но
> обычно больше пользы от кода не имеющего утечек, т.к. его
> многократное выполнение не приведёт к перерасходу/исчерпанию
> ресурсов.
>
По сути - твой пост о MemProof. Что в нём отбражается - я не знаю, посему молчу.
← →
guav © (2006-08-25 12:46) [6]> По сути - твой пост о MemProof. Что в нём отбражается -
> я не знаю, посему молчу.
Там отображаются количество открытые программой хендлов ресурсов (в т.ч. хендлы файлов, UI и GDI), выделенные блоки памяти. После завершения отображаются те которые не были освобождены явно. Это позволяет убедится в отсутствии утечек и упрощает их поиск при их наличии.
← →
GrayFace © (2006-08-25 17:52) [7]Атомы остаются. Причем в любой проге, использующей VCL есть 2 атома. Так что, если 32767 раз нажать Ctrl+F2, по идее ни одно VCL приложение уже не запустится до перезагрузки.
← →
DevilDevil © (2006-08-25 19:33) [8]> GrayFace © (25.08.06 17:52) [7]
это точно!
Я чё то не догоняю... Допустим занял [у Винды] я 40 мегабайт из Кучи, приложение завершилось по Ctrl+F2, занимаемые 40 мегабайт так и остались запертыми... и отпереть по идее ни кто не имеет права, даже Винда. Это я и называю утечкой памяти. Говоря о классах и деструкторах... честно говоря имел ввиду, что память под них освобождается [в Куче]. Тоже самое наверняка и с видеопамятью, если OpenGL-приложение завершилось со страшнейшей руганью. Я не прав?
← →
Чапаев © (2006-08-25 19:40) [9]> отпереть по идее ни кто не имеет права, даже Винда
Прокурору о своих правах расскажешь... Или Флёнову...
← →
Fay © (2006-08-25 21:42) [10]> Я чё то не догоняю...
> Я не прав?
Прав.
← →
DrPass © (2006-08-26 12:31) [11]
> DevilDevil © (25.08.06 19:33) [8]
> Допустим занял [у Винды] я 40 мегабайт из Кучи, приложение
> завершилось по Ctrl+F2, занимаемые 40 мегабайт так и остались
> запертыми... и отпереть по идее ни кто не имеет права, даже
> Винда. Это я и называю утечкой памяти
У Винды, условно говоря, нет кучи. Она создает для каждого процесса его индивидуальное адресное пространство с кучей, и уничтожает его вместе с кончиной этого процесса. И никаких куч не остается
← →
DevilDevil © (2006-08-26 16:40) [12]> DrPass © (26.08.06 12:31) [11]
А откуда Винда знает, может моё приложение изначально предназначается для предоставления другому приложению идентификатора занятой области памяти. Вдруг полученный мной Handle будет использовать другое приложение? Существуют же к примеру Shared Битмапы
← →
Fay © (2006-08-26 17:09) [13]2 DevilDevil © (26.08.06 16:40) [12]
> А откуда Винда знает, может моё приложение изначально предназначается для
Ей по барабану.
> идентификатора занятой области памяти
Это хто такой?
> Вдруг полученный мной Handle будет использовать другое приложение
Handle чего?
← →
Чапаев © (2006-08-26 17:10) [14]> [12] DevilDevil © (26.08.06 16:40)
Можно попробовать вместо Флёнова читать Рихтера, Руссиновича... Есть шанс, что поймёшь.
← →
Ketmar © (2006-08-26 17:17) [15]> [12] DevilDevil © (26.08.06 16:40)
а ей это знать и не надо.
← →
DevilDevil © (2006-08-26 18:30) [16]> Ketmar © (26.08.06 17:17) [15]
расшифруй
> Fay © (26.08.06 17:09) [13]
Handle чего?
При захвате памяти из кучи, (в большинстве случаев :) ) возвращается Handle на область памяти. Чтобы воспользоваться этой памятью, надо:begin
запереть область памяти, получить указатель
изменить эту область памяти используя полученный указатель
отпереть область памяти, используя Handle
end;
← →
Ketmar © (2006-08-26 18:41) [17]> [16] DevilDevil © (26.08.06 18:30)
конкретно какая буква неясна?
← →
Fay © (2006-08-26 18:44) [18]2 DevilDevil © (26.08.06 18:30) [16]
Какая функция возвращает Handle области памяти?
← →
Ketmar © (2006-08-26 18:55) [19]> [16] DevilDevil © (26.08.06 18:30)
перечитал документацию по HeapAlloc() три раза. никакого возврата handle так и не нашёл.
← →
DevilDevil © (2006-08-26 19:34) [20]> Fay © (26.08.06 18:44) [18]
> Ketmar © (26.08.06 18:55) [19]
см. GlobalAlloc, GlobalReAlloc, GlobalLock, GlobalUnLock и будет тебе счастье
← →
DrPass © (2006-08-26 20:02) [21]
> DevilDevil © (26.08.06 19:34) [20]
Если бы ты все-таки читал нужные книги, то знал бы, что Global*** выделяют память тоже только в локальном адресном пространстве процесса. Название, по-старинке, сохранилось со времен Win3.x
И никакие дескрипторы после смерти процесса не сохранятся.
← →
Ketmar © (2006-08-26 20:02) [22]> [20] DevilDevil © (26.08.06 19:34)
а зачем?
← →
Fay © (2006-08-26 20:03) [23]2 DevilDevil © (26.08.06 19:34) [20]
> см. GlobalAlloc, GlobalReAlloc, GlobalLock, GlobalUnLock и будет тебе счастье
Ни одна из этих функций не возвщает Handle (в обычном смысле). В лучшем случае - указатель.
← →
DevilDevil © (2006-08-26 20:36) [24]> Fay © (26.08.06 20:03) [23]
Указатель возвращается при константеGMEM_FIXED
, в остальных случаях - дескриптор, иначе говоря -Handle
:
Return Values
If the function succeeds, the return value is the handle of the newly allocated memory object.
Остаётся главный вопрос:
Если я завершу своё приложение процедуройHalt
(из Delphi или нет - без разницы), то никаких деструкторов вызвано не будет, зато будут вызваны все finalization-секции; в любом случае занимаемая оперативная память будет освобождена. Другими словами, можно не вызывать деструкторы по завершению приложения (в том числе захватывающие большие объёмы оперативной памяти). В случае необходимости освобождения каких либо других ресурсов, можно использовать секцию finalization.
Я прав?
← →
Ketmar © (2006-08-26 20:47) [25]> [24] DevilDevil © (26.08.06 20:36)
собственно, ресурсы и так освободят. но лучше, всё-таки, ручками -- бонтон.
← →
Чапаев носками хакера (2006-08-26 21:06) [26]> Ни одна из этих функций не возвщает Handle
А HMEM, возвращаемый GlobalAlloc"ом -- чем не хэндл?
> В случае необходимости освобождения каких либо других ресурсов,
> можно использовать секцию finalization.
Можно. Но не слишком-то нужно.
← →
DevilDevil © (2006-08-26 23:59) [27]> Ketmar © (26.08.06 20:47) [25]
Who is "бонтон" ?
ручками - т.е. в finalization?
← →
Ketmar © (2006-08-27 00:01) [28]> [27] DevilDevil © (26.08.06 23:59)
"хороший тон". антоним к "моветон""у.
← →
Ketmar © (2006-08-27 00:02) [29]> [27] DevilDevil © (26.08.06 23:59)
не обязательно именно там. лучше там же, где запрашиваешь. запрасил в initialization -- тогда в finalization. создал в коде -- там же и убивай.
← →
Ketmar © (2006-08-27 00:02) [30]в смысле, в коде основной программы.
← →
Fay © (2006-08-27 00:50) [31]А в чём прикол, удалять объекты, которые дохнут самомтоятельно?
← →
Ketmar © (2006-08-27 01:20) [32]> [31] Fay © (27.08.06 00:50)
в том, что привыкаешь удалять. и потом лики не ищешь судорожно. %-)
← →
Германн © (2006-08-27 01:31) [33]
> Fay © (27.08.06 00:50) [31]
>
> А в чём прикол, удалять объекты, которые дохнут самомтоятельно?
>
В дополнение к Ketmar © (27.08.06 01:20) [32] скажу ещё, что (правда это вне сабжа) программа может, а иногда и должна работать "вечно"! Точнее хотелось бы. :-) Так вот ещё и ради этого и стОит удалять самому то, сам создал.
← →
DevilDevil © (2006-08-27 01:43) [34]Всем спасибо!
P.S. Много лишнего конечно (как обычно)... но то, что нужно было узнать, я узнал... и даже больше (DrPass © (26.08.06 20:02) [21]).
Ещё раз спасибо
← →
jack128 © (2006-08-27 02:34) [35]Fay © (27.08.06 0:50) [31]
А в чём прикол, удалять объекты, которые дохнут самомтоятельно?
в принципе. "Я тебя породил - я тебя и убью"
← →
Германн © (2006-08-27 02:43) [36]
> jack128 © (27.08.06 02:34) [35]
Жень. Ну хотя бы смайлик поставил бы. Я уж молчу про Копирайт. :-)
← →
Пусик © (2006-08-27 22:55) [37]
> Копирайт
Это кто?
← →
Германн © (2006-08-28 00:26) [38]
> усик © (27.08.06 22:55) [37]
>
>
> > Копирайт
>
>
> Это кто?
Это сосед Кворума. :-)
← →
jack128 © (2006-08-28 11:37) [39]Германн © (27.08.06 2:43) [36]
Жень. Ну хотя бы смайлик поставил бы. Я уж молчу про Копирайт. :-)
Да ладно, каждый их расставит в меру своего опыта в программировании и общей образованности ;-)
← →
Fay © (2006-08-28 11:41) [40]2 Германн © (27.08.06 1:31) [33]
> и должна работать "вечно"!
А как это связяно с [0] ?
← →
Германн © (2006-08-28 18:06) [41]
> А как это связяно с [0] ?
А должно быть связано?
Зато связано с [31].
← →
isasa © (2006-08-28 18:22) [42]Тут никто не вспомнил о COM объектах, а зря ...
← →
DevilDevil © (2006-08-28 18:53) [43]> isasa © (28.08.06 18:22) [42]
что для них характерно?
← →
isasa © (2006-08-28 19:17) [44]DevilDevil © (28.08.06 18:53) [43]
что для них характерно?
А то, что если ты, например, сделал CreateOleObject("да тот-же Excel.Application"), то после сноса, все давить руками придется в диспетчере задач. :)
← →
Fay © (2006-08-28 19:19) [45]2 isasa © (28.08.06 19:17) [44]
> после сноса, все давить руками придется в диспетчере задач
Есть такое. Но что тут характерного для COM ?
← →
isasa © (2006-08-28 19:24) [46]Fay © (28.08.06 19:19) [45]
Да, в общем, ничего особенного. COM, как COM. :)
Мисли о аварийном завершении ...
← →
Fay © (2006-08-28 19:31) [47]2 isasa © (28.08.06 19:24) [46]
Т.о. для COM объектов характерны мысли об аварийном завершении? Любопытно...
← →
DevilDevil © (2006-08-28 19:35) [48]> isasa © (28.08.06 19:17) [44]
Мда, это всё, или ёще есть что-то?
← →
isasa © (2006-08-28 21:43) [49]DevilDevil © (28.08.06 19:35) [48]
:)
К сожалению, больше ничего нет.
Fay © (28.08.06 19:31) [47]
Сколько пустых строк(или килобайт) нужно вставлять между фразами, чтобы человек их разделял?
← →
Fay © (2006-08-28 21:44) [50]2 isasa © (28.08.06 21:43) [49]
Бывает. Я ~30 часов не спал 8(
Страницы: 1 2 вся ветка
Текущий архив: 2006.10.08;
Скачать: CL | DM;
Память: 0.58 MB
Время: 0.05 c