我在下面的代碼中顯示用戶類的簡短設計模式。內存泄漏與訪問衝突,類設計問題
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)。 –