我一直在遇到一些錯誤,其中對象以某種方式被釋放,但最終我們調用了FreeMem。當然這會導致一個錯誤,因爲內存已經被釋放並拋出一個錯誤。在調用FreeMem之前檢查內存是否已分配(Delphi 32)
我知道一個try-catch塊可能會修復它,但這是很多try-catch塊。使用常規object.free避免這種情況的方法是FreeAndNil(object),但我無法找到FreeMem的等效項。在釋放之前測試它是否被分配的東西。
什麼是最好的解決方案在這裏易於閱讀,可維護性和穩定性。
我一直在遇到一些錯誤,其中對象以某種方式被釋放,但最終我們調用了FreeMem。當然這會導致一個錯誤,因爲內存已經被釋放並拋出一個錯誤。在調用FreeMem之前檢查內存是否已分配(Delphi 32)
我知道一個try-catch塊可能會修復它,但這是很多try-catch塊。使用常規object.free避免這種情況的方法是FreeAndNil(object),但我無法找到FreeMem的等效項。在釋放之前測試它是否被分配的東西。
什麼是最好的解決方案在這裏易於閱讀,可維護性和穩定性。
相當於FreeAndNil也只是
FreeMem(p);
p := nil;
但你會更好地發現哪些對象使用它釋放之後解決真正的問題。試試FastMM--它會幫助你完成這項任務。
不管怎樣,您都不應該在對象上調用FreeMem。它需要通過析構函數銷燬它,然後調用Free。但是,如果您正在處理指向其他事情的指針(例如記錄),那麼請按照Ulrich所說的去做。 (這兩個部分。)
實際上Daisetsu需要停止調用從AllocMem對象獲得的內存。 – 2010-07-13 05:03:37
@Cosmin:「對象」這個詞不一定是狹義的。 – 2010-07-13 07:06:44
作爲Ulrich的一個例子:TP對象(Delphi仍然支持)可以通過allocmem完美分配。類有實例化的原因。 – 2010-07-13 09:26:34
感謝您的意見。我追蹤了這個問題,並且是在創建一個耗盡內存的對象時發生的。這會拋出一個錯誤並且控制返回到在對象上調用create的塊。問題是創建在一個try-catch塊中,並有一個釋放對象的finally節。在銷燬該對象時,它調用FreeMem(p),結果是內存從未被分配。我可以通過初始化所有p來解決這個問題。 – Daisetsu 2010-07-12 23:41:56
分配資源的代碼部分不應該放在'try-finally'塊中,它應該在'try'之前。如果在'try-finally'塊中有AllocMem,並最終在'finally'中調用FreeMem,然後在你進入'try'之前分配指針'nil',以使'finally'安全。 – 2010-07-13 05:01:37
freemem已經是VAR了,所以你可以簡單地在內存管理器中實現它。 freeandnil存在的原因是,當你做的時候,你沒有引用存儲對象引用的地方.Free;你只有值(對象) – 2010-07-13 09:25:19