2

VCL フォーム アプリケーションに次のコードがあります。

implementation

{$R *.dfm}

var
  MyBitmap: TBitmap;

procedure TFormMain.FormCreate(Sender: TObject);
begin
  MyBitmap := TBitmap.Create;
end;

procedure TFormMain.FormDestroy(Sender: TObject);
begin
  if Assigned(MyBitmap) then
    MyBitmap.Free;
end;

procedure TFormMain.Button1Click(Sender: TObject);
begin
  if Assigned(MyBitmap) then
    MyBitmap.Free;
end;

MyBitmap.Free;ボタンを 2 回目にクリックすると、ボタンのクリック ハンドラでアクセス違反が発生します。ただしMyBitmap、最初のボタン クリック後は、もう割り当てるべきではありません。if Assigned(MyBitmap) thenでは、最初のボタン クリックでは明らかに機能したのに、2 回目のボタン クリックでは機能しないのはなぜでしょうか。

Delphi 10.1 ベルリン アップデート 2

4

1 に答える 1

6

このAssigned関数は、ポインターが であることのみをチェックしますNil。既存のオブジェクトを指しているかどうかのチェックは実行しません。関数を期待どおりに動作さNilせるには、解放した後に に設定する必要があります。両方の命令を実行します。AssignedFreeAndNil

于 2016-12-07T17:27:20.810 に答える