Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Безопасное аварийное завершение приложения


Страницы:   1 2 3

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 мегабайт так и остались
> запертыми... и отпереть по идее ни кто не имеет права, даже
> Винда. Это я и называю утечкой памяти

У Винды, условно говоря, нет кучи. Она создает для каждого процесса его индивидуальное адресное пространство с кучей, и уничтожает его вместе с кончиной этого процесса. И никаких куч не остается


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо