![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Безопасное аварийное завершение приложения
DevilDevil © (2006-08-25 01:46:00)При возникновении каких либо даже серьёзных ошибок в приложении из под Delphi, достаточно нажать Ctrl+F2, чтобы приложение закрылось, все деструкторы были выполнены (как мне кажется), не произошло утечек памяти. Существуют ли вообще такие методы (а в частности, является ли такой процедура Halt), позволяющие безопасно, без утечек ресурсов, завершающих приложение хотя бы из среды?
Ketmar (2006-08-27 00:02:00) [21]в смысле, в коде основной программы.
Ketmar (2006-08-27 00:02:00) [22]> [27] DevilDevil © (26.08.06 23:59)
не обязательно именно там. лучше там же, где запрашиваешь. запрасил в initialization -- тогда в finalization. создал в коде -- там же и убивай.
Ketmar (2006-08-27 00:01:00) [23]> [27] DevilDevil © (26.08.06 23:59)
"хороший тон". антоним к "моветон"'у.
DevilDevil (2006-08-26 23:59:00) [24]> Ketmar © (26.08.06 20:47) [25]
Who is "бонтон" ?
ручками - т.е. в finalization?
Чапаев носками хакера (2006-08-26 21:06:00) [25]> Ни одна из этих функций не возвщает Handle
А HMEM, возвращаемый GlobalAlloc'ом -- чем не хэндл?
> В случае необходимости освобождения каких либо других ресурсов,
> можно использовать секцию finalization.
Можно. Но не слишком-то нужно.
Ketmar (2006-08-26 20:47:00) [26]> [24] DevilDevil © (26.08.06 20:36)
собственно, ресурсы и так освободят. но лучше, всё-таки, ручками -- бонтон.
DevilDevil (2006-08-26 20:36:00) [27]> 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.
Я прав?
Fay (2006-08-26 20:03:00) [28]2 DevilDevil © (26.08.06 19:34) [20]
> см. GlobalAlloc, GlobalReAlloc, GlobalLock, GlobalUnLock и будет тебе счастье
Ни одна из этих функций не возвщает Handle (в обычном смысле). В лучшем случае - указатель.
Ketmar (2006-08-26 20:02:00) [29]> [20] DevilDevil © (26.08.06 19:34)
а зачем?
DrPass (2006-08-26 20:02:00) [30]
> DevilDevil © (26.08.06 19:34) [20]
Если бы ты все-таки читал нужные книги, то знал бы, что Global*** выделяют память тоже только в локальном адресном пространстве процесса. Название, по-старинке, сохранилось со времен Win3.x
И никакие дескрипторы после смерти процесса не сохранятся.
DevilDevil (2006-08-26 19:34:00) [31]> Fay © (26.08.06 18:44) [18]
> Ketmar © (26.08.06 18:55) [19]
см. GlobalAlloc, GlobalReAlloc, GlobalLock, GlobalUnLock и будет тебе счастье
Ketmar (2006-08-26 18:55:00) [32]> [16] DevilDevil © (26.08.06 18:30)
перечитал документацию по HeapAlloc() три раза. никакого возврата handle так и не нашёл.
Fay (2006-08-26 18:44:00) [33]2 DevilDevil © (26.08.06 18:30) [16]
Какая функция возвращает Handle области памяти?
Ketmar (2006-08-26 18:41:00) [34]> [16] DevilDevil © (26.08.06 18:30)
конкретно какая буква неясна?
DevilDevil (2006-08-26 18:30:00) [35]> Ketmar © (26.08.06 17:17) [15]
расшифруй
> Fay © (26.08.06 17:09) [13]
Handle чего?
При захвате памяти из кучи, (в большинстве случаев :) ) возвращается Handle на область памяти. Чтобы воспользоваться этой памятью, надо:
begin
запереть область памяти, получить указатель
изменить эту область памяти используя полученный указатель
отпереть область памяти, используя Handle
end;
Ketmar (2006-08-26 17:17:00) [36]> [12] DevilDevil © (26.08.06 16:40)
а ей это знать и не надо.
Чапаев (2006-08-26 17:10:00) [37]> [12] DevilDevil © (26.08.06 16:40)
Можно попробовать вместо Флёнова читать Рихтера, Руссиновича... Есть шанс, что поймёшь.
Fay (2006-08-26 17:09:00) [38]2 DevilDevil © (26.08.06 16:40) [12]
> А откуда Винда знает, может моё приложение изначально предназначается для
Ей по барабану.
> идентификатора занятой области памяти
Это хто такой?
> Вдруг полученный мной Handle будет использовать другое приложение
Handle чего?
DevilDevil (2006-08-26 16:40:00) [39]> DrPass © (26.08.06 12:31) [11]
А откуда Винда знает, может моё приложение изначально предназначается для предоставления другому приложению идентификатора занятой области памяти. Вдруг полученный мной Handle будет использовать другое приложение? Существуют же к примеру Shared Битмапы
DrPass (2006-08-26 12:31:00) [40]
> DevilDevil © (25.08.06 19:33) [8]
> Допустим занял [у Винды] я 40 мегабайт из Кучи, приложение
> завершилось по Ctrl+F2, занимаемые 40 мегабайт так и остались
> запертыми... и отпереть по идее ни кто не имеет права, даже
> Винда. Это я и называю утечкой памяти
У Винды, условно говоря, нет кучи. Она создает для каждого процесса его индивидуальное адресное пространство с кучей, и уничтожает его вместе с кончиной этого процесса. И никаких куч не остается