Нарушение прав доступа при освобождении переменной TBitmap - битовая переменная все еще назначается после освобождения?
У меня есть этот код в приложении VCL Forms:
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;
в обработчике нажатия кнопки. Но MyBitmap
больше не должен назначаться после первого нажатия кнопки. Так почему условие if Assigned(MyBitmap) then
не работает при втором нажатии кнопки, когда он, очевидно, работал при первом нажатии кнопки?
Delphi 10.1 Berlin Обновление 2
1 ответ
Решение
Assigned
функция проверяет только указатель Nil
, Он не выполняет проверку, указывает ли он на существующий объект или нет. Вам нужно установить его Nil
после освобождения, чтобы получить Assigned
Функция работы, как вы ожидаете. FreeAndNil
выполняет обе инструкции.