簡體   English   中英

這會導致內存泄漏嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM