无效的指针操作释放对象

时间:2016-01-30 20:34:24

标签: delphi

作为OOP的新手,我很好奇为什么Delphi XE7在我尝试释放它时使用的日志类上生成了无效的指针操作。所以我创建了一个简单的测试来创建一个对象然后释放它。我不确定我在这里缺少什么以及为什么在调用MyObject.Free时抛出此异常。

在第一个单元中,我创建了这个对象的实例,如下所示。

unit Unit1;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Unit2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  MyObject: TMyObject;

implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyObject := TMyObject.Create;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  MyObject.Free;
end;

end.

在第二单元中,我的对象定义如下。

unit Unit2;
interface
uses System.Classes;

  type
  TMyObject = class
  public
    constructor Create;
    destructor Free;
  end;

implementation

constructor TMyObject.Create;
begin
  inherited Create;
end;

destructor TMyObject.Free;
begin
  inherited Free;
end;

end.

感谢任何帮助。

1 个答案:

答案 0 :(得分:5)

始终通过覆盖名为Destroy的虚拟析构函数来实现析构函数。

type
  TMyObject = class
  public
    constructor Create;
    destructor Destroy; override;
  end;

constructor TMyObject.Create;
begin
  inherited;
end;

destructor TMyObject.Destroy;
begin
  inherited;
end;

要销毁实例,请调用Free中名为TObject的方法。仅当实例不是Destroy时,才会调用虚拟析构函数nil

从文档中了解更多信息:

名称MyObject很弱。对象用于实例。类用于类。