Вызов анонимной функции из указателя

#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 представляют собой простые типы значений, такие как целые числа или статические массивы целых чисел.