[英]Is this going to cause a memory leak?
type
TTest = class
a: integer;
end;
TTest2 = class(TTest)
b: integer;
end;
var c:TTest;
begin
c:=TTest2.Create();
c.Free;
end;
不,不會。
基類類型的變量可用於從其子類實例化對象(它們是類型兼容的),但請注意,使用此類變量,您將只能訪問TTest成員,而不能訪問TTest2成員。 那意味着 您可以訪問“ a”,但不能訪問“ b”。
另外,如果在執行TTest2.Creation時遇到任何異常,則Create不會返回部分生成的對象。
但是,如果在TTest2.Create和c.Free調用之間還有其他代碼,則在這些代碼中引發異常可能會導致內存泄漏。 因為C.Free可能不會執行。 在這種情況下,應使用try-finally塊。
不,這里沒有內存泄漏。 構造函數僅在成功后才返回新資源。 僅當構造函數成功且無法調用Free
,您才能泄漏。 由於在構造函數和對Free
的調用之間不執行任何操作,因此不會泄漏。
如果構造函數失敗,則:
c
的分配。 請注意,您接受的來自@vcldeveloper的答案在說明返回nil
是錯誤的。 引發的構造函數不返回任何內容。
您應該始終使用try / final將Create / Free對打包,如下所示:
obj := TMyClass.Create;
try
obj.DoSomething;
finally
obj.Free;
end;
分配資源后,只需保護該資源 。 因此,您可以在分配作業后進行try
。
如果將try
放在錯誤的構造函數之前:
try
obj := TMyClass.Create;
obj.DoSomething;
finally
obj.Free;
end;
如果構造函數失敗,則不分配obj
,然后在Free
運行時(它將通過finally來運行),它將在未初始化的變量上調用,這將導致未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.