2016-01-30 34 views
2

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

任何帮助表示赞赏。

+3

欢迎来到StackOverflow。你的析构函数应该是标准** Destroy **析构函数的重写,而不是Free。 – MartynA

回答

5

总是通过重写名为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较弱。对象用于实例。类用于类。