【问题标题】:Invalid Pointer Operation freeing an object释放对象的无效指针操作
【发布时间】:2016-01-30 20:34:23
【问题描述】:

作为 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.

感谢任何帮助。

【问题讨论】:

  • 欢迎来到 StackOverflow。您的析构函数应该是标准 Destroy 析构函数的覆盖,而不是 Free。

标签: delphi


【解决方案1】:

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

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

constructor TMyObject.Create;
begin
  inherited;
end;

destructor TMyObject.Destroy;
begin
  inherited;
end;

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

从文档中了解更多信息:

MyObject 这个名字很弱。对象用于实例。类用于类。

【讨论】:

    猜你喜欢
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多