Программы, написанные на Делфи, после крэша почему-то продолжают работать и я уже не понимаю что с ними происходит в этот момент.
Чёрт его знает, как это устроено.
g-cont
> Программы, написанные на Делфи, после крэша почему-то продолжают работать и я
> уже не понимаю что с ними происходит в этот момент.
> Чёрт его знает, как это устроено.
Вангую что ты можешь представить себе что каждая отдельная функция/метод обернут в трай кэтч.
И продолжение работы это просто скип данной функции.
g-cont
> Программы, написанные на Делфи, после крэша почему-то продолжают работать
А почему бы и нет?
g-cont
> Чёрт его знает, как это устроено.
https://docs.microsoft.com/ru-ru/cpp/cpp/structured-exception-han… view=msvc-170
... __declspec(noinline) void TestCPPEX( ) { #ifdef CPPEX printf( "Throwing C++ exception\r\n"); throw std::exception( ""); #else printf( "Triggering SEH exception\r\n"); volatile int *pInt = 0x00000000; *pInt = 20; #endif } __declspec( noinline) void TestExceptions( ) { TestClass d; TestCPPEX( ); } int main( ) { __try { TestExceptions( ); } __except( EXCEPTION_EXECUTE_HANDLER) { printf( "Executing SEH __except block\r\n"); } return 0; }
=A=L=X=
В крестах по дефолту не принято так баловаться с исключениями, а тем более вообще их выключать.
А вот в Делфи это наверное часть идеологии.
Aslan
> А почему бы и нет?
А что можно гарантировать в такой ситуации? Не думаю что всё это детально тестировалось.
=A=L=X=
> __try
BRUTAL TRY! Handle anything!
g-cont
> а тем более вообще их выключать.
Так никто ничего не выключает.
> А вот в Делфи это наверное часть идеологии.
Идеология не при чём - просто в какой то момент реализацию исключений полностью реализовали вокруг майкрософтовского механизма Structured Exception Handling который встроен в MS Windows и как последствие EAccessViolation просто одно из возможных исключений в Дельфи.
Краши в Паскале обычно легко отлавливаются(например, где-то указатель не инициализирован или массив). Но есть еще такой тип ошибок как логический, то есть, когда функционал программы работает не так как ожидается. Куда более трудно устранимое явление. Эти ошибки зачастую хоть и не вызывают крашей, но являются неприятным моментом при тестировании и тут уже любой компилятор бессилен(так как комп тупо не знает, какой функционал программист хочет заложить в ту или иную программу).
g-cont
> В крестах по дефолту не принято так баловаться с исключениями, а тем более
> вообще их выключать.
> А вот в Делфи это наверное часть идеологии.
Где ты это видел? За этим ещё больше нужен глаз да глаз. Где-то отключил, надо обязательно включить.
samrrr
> и аналог std::vector приходится вручную освобождать
можно замарочиться и не вручную:
program ideone; {$mode objfpc} {$modeswitch advancedrecords} type generic TVec<T> = record private function GetVal(ofs: integer): T; procedure SetVal( ofs: integer; aval: T); public data: array of T; procedure insert( ofs: integer; const vl: T); property items[ofs: integer]: T read GetVal write SetVal ; default; function Count: Integer; end; TIntVec = specialize TVec<integer>; procedure TVec.insert( ofs: integer; const vl: T); begin if ofs<0 then Exit; if ofs>length( data) then Exit; SetLength( data, length( data)+1); if( ofs < length( data)-1) then move( data[ofs], data[ofs+1], sizeof( vl)*( length( data)-ofs)); data[ofs]:=vl; end; function TVec.GetVal( ofs: integer): T; begin Result:=data[ofs]; end; procedure TVec.SetVal( ofs: integer; aval: T); begin data[ofs]:=aval; end; function TVec.Count: Integer; begin result := length( data); end; var i : integer; iv : TIntVec; begin iv.Insert( 0, 5); iv.Insert( 0, 20); for i:=0 to iv.Count-1 do writeln( iv[i]); end.
а как быть с RAII, если переменные объявляются строго в секции var?
skalogryz
> можно замарочиться и не вручную:
TIntVec = specialize TVec<integer>;
Что-то мн кажется этот фокус не прокатит с классами в дельфи.
samrrr
> Что-то мн кажется этот фокус не прокатит с классами в дельфи.
У меня как-то так:
https://github.com/MrShoor/AvalancheProject/blob/master/Utils/avcontnrs.pas
Работает и в делфи и в лазарусе.
+ поскольку оно на интерфейсах - парится по поводу очистки памяти не надо
MrShoor
> У меня как-то так:
То-есть сделать нормальный массив в дельфи можно, но для этого прийдётся свой велосипед пилить?
skalogryz
> переменные объявляются строго в секции var?
Это самый эпичный фейл языка. В итоге написание любой функции на паскале начинается с копирования var из другой функции.