Главная страница
    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] ?


 
Германн ©   (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
2-1158735720
kyn66
2006-09-20 11:02
2006.10.08
Как проверить значение полей при вводе добавлении записи?


4-1148709908
Delphi_is_cool
2006-05-27 10:05
2006.10.08
Ресурсы(RCDATA->BITMAP ?)


2-1158733722
TrainerOfDolpins
2006-09-20 10:28
2006.10.08
Как приложению узнать, где его exe-файл?


2-1158227996
worldmen
2006-09-14 13:59
2006.10.08
Вставить текст в другую программу.


3-1154672476
Progr_Neud
2006-08-04 10:21
2006.10.08
Параметры в ADO: q2: Parameter i not found





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский