2011-09-29 136 views
7

在使用工廠構建對象的項目上工作。我在全局變量(我不知道)中保留指向工廠函數的指針,並在初始化時註冊它們。德爾福內存問題(FastMM4)

我最近有興趣瞭解該項目是否存在內存泄漏,因此決定下載FastMM4並進行查看。它提出了一些我可以修復的錯誤,但這個我有點難住似乎沒有釋放與工廠相關的內存,如下面的代碼所示我得到一個小內存泄漏。儘管如此,這並不荒謬但令人討厭。

我會用什麼來釋放內存(如果是這樣)我試過處理(@factoryfunction),但似乎破壞了一切。我對低級別的指針不太滿意,總是把我搞糊塗了,所以如果有人能幫上忙,那會很棒。

我已經在下面列出了一個例子,我剛剛寫下了我的頭頂,說明了我遇到的問題。

乾杯,

巴里

unit Test; 

interface 

uses classes; 

type 

TAFactoryFunction = reference to function (const aType : integer): TObject; 

function testfunction (const aType : integer) : TObject; 

implementation 

function testfunction(const aType: integer) : TObject; 
begin 
    result := TObject.Create; 
end; 

var 
    FactoryFunction : TAFactoryFunction 

initialization 
    FactoryFunction := testfunction; 

finalization 
    // possibly some freemem code here? 

end. 
+0

我很好奇 - 爲什麼你使用「引用函數」而不是簡單的函數類型?這將避免內存泄漏,因爲它不涉及編譯器跳過箍環來實現可以更簡單地實現的內容。 或者,這種情況下簡化的例子並不能完全反映原始情況嗎? – Deltics

+0

就像使用它的打字相對鬆散一樣,因此變量可以採用過程,方法或匿名方法。它被用於框架,所以想盡可能地擴展它。 – Barry

+0

雖然我不確定這是否達到目的,是嗎?引用仍然必須是適當簽名的功能,否?如果不是的話,我會說這是避免類似瘟疫之類的事情的原因!如果我將某個類型聲明爲具有某個簽名的函數,那麼最好使用它。還有別的要求維護頭痛(更不用說混亂)。 問題仍然存在,爲什麼你想要這種靈活性,除了因爲你可以/想要?靈活性在您的框架中有什麼用途? – Deltics

回答

5

我剛剛德爾福2010年測試了這一點,它似乎是一個錯誤。編譯器應該生成代碼來清理它,但事實並非如此。就像David所說,即使寫作FactoryFunction := nil也不行。

您應該在QC中報告此錯誤。

+0

好像還有一個額外的'IntfCopy'調用,導致引用計數被設置爲2.不知道爲什麼是這樣。 –