Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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] ?



Страницы: 1 2 вся ветка

Текущий архив: 2006.10.08;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.052 c
2-1158562313
pathfinder
2006-09-18 10:51
2006.10.08
Общий вопрос..


1-1156420595
DevilDevil
2006-08-24 15:56
2006.10.08
OnKeyDown работает некорректно


2-1159095853
Серый
2006-09-24 15:04
2006.10.08
Функция Int(n)


15-1158561071
Колдун
2006-09-18 10:31
2006.10.08
Фэнтези


2-1158766989
Image
2006-09-20 19:43
2006.10.08
Кто нибудь знает как сохранить форму вместе со всем содержимым в