#delphi #anonymous-function #delphi-xe7
#delphi #анонимная функция #delphi-xe7
Вопрос:
Я получаю нарушение доступа при попытке вызвать анонимный метод из Pointer
переменной
var
Proc : TProc;
Pt : Pointer;
begin
Proc := procedure
begin
ShowMessage('Hello World');
end;
Pt := @Proc;
TProc(Pt)();
end;
В debug я вижу, что Pt
это вычисляется
Комментарии:
1. Это не закончится хорошо, но то, что вы делаете, похоже на
P := @SomeInt; X := Integer(P)
. Вы взяли адрес анонима. Поэтому вам нужно будет разыменовать этот адрес. Но, как я уже сказал, это, скорее всего, не закончится хорошо. Предположительно, в вашем реальном коде вы хотите где-то сохранить этот указатель. Это происходит за счет подсчета ссылок. Чего вы на самом деле пытаетесь достичь здесь?2. Разыменование сработало хорошо
TProc(Pt^)();
. Спасибо за предупреждения, как только мояProc
переменная выйдет из области видимости, указатель будет небезопасен для использования. Я просто играл без какого-либо реального плана, но я не понимал нарушения доступа3. @Fabrizio: Правильно. Вы можете столкнуться с такими же проблемами, если будете возиться с другими управляемыми типами, такими как строки и динамические массивы. Просто не делайте этого!
4. @AndreasRejbrand и записи
5. @Bitman: не POD-записи. Только записи, содержащие управляемые типы (например, строки). Записи POD представляют собой простые типы значений, такие как целые числа или статические массивы целых чисел.