我在下面的代码中显示用户类的简短设计模式。内存泄漏与访问冲突,类设计问题
type
MytestClass = class
alist: TStringlist;
public
constructor Create;
destructor destroy; override;
end;
{ MytestClass }
type
TForm1 = class(TForm)
btn_version01: TBitBtn;
btnversion02: TBitBtn;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure btn_version01Click(Sender: TObject);
procedure btnversion02Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
btestClass : MytestClass;
aComplexClassDesign : TComplexClassDesign;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
constructor MytestClass.Create;
begin
alist := TStringlist.Create;
end;
destructor MytestClass.destroy;
begin
alist.free;
inherited;
end;
procedure TForm1.btnversion02Click(Sender: TObject);
var atestClass : MytestClass;
begin
///
atestClass :=MytestClass.Create;
atestClass.Free;
atestClass := nil;
end;
procedure TForm1.btn_version01Click(Sender: TObject);
var atestClass : MytestClass;
begin
///
atestClass :=MytestClass.Create;
atestClass.Free;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
btestClass.free;
aComplexClassDesign.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
btestClass :=MytestClass.Create;
aComplexClassDesign :=TComplexClassDesign.Create;
end;
end.
希望这是一个没有内存泄漏和访问冲突的完美设计。我在真实应用程序中使用的所有类都是按照这种模式设计的。
在上面的代码中,FastMM4不会在我的TComplexClassDesign中显示任何问题。在实际应用程序中,FASTMM4报告了我的TComplexClassDesign的内存泄漏,即使我在窗体的Close事件中调用了自由函数。如果我通过代码确定执行此功能。 任何想法如何调试此内存泄漏报告,任何选项来查看尚未发布的TComplexClassDesign的实例?为什么我得到这个奇怪的内存泄漏报告的其他原因?
奖金的问题:
DUNIT总是这样
atestClass :=MytestClass.Create;
atestClass.Free;
atestClass := Nil
拆解代码是真正需要的代码的最后一行?
'>是最后一行代码真正需要的?'。不,这是不需要的。如果变量'atestClass'被重用,最好不要使用它,否则不会。多年来一直在讨论很多,因为在某些情况下它可以使调试变得更容易。搜索'FreeAndNil()'。 [哪一个更好:Free或FreeAndNil?](http://stackoverflow.com/questions/3159376/which-is-preferable-free-or-freeandnil)。 –