2010-02-22 65 views
0

由於我在嘗試使用DLL時遇到了很多困難,因此我決定嘗試運行時包(主要是爲了避免內存管理器和類型註冊表問題)。包內存管理

從我的應用程序做這樣的事情:

HandleList := TList <THandle>.Create; 
try 
    PackageObj.DoSomething (HandleList); 
finally 
    FreeAndNil (HandleList); 
end; 

的方法(運行時包中),只是增加了一些東西到列表:

procedure TPackageObject.DoSomething (HandleList: TList <THandle>); 
begin 
    HandleList.Clear; 
    HandleList.Add (0); 
end; 

我得到Invalid Pointer例外,無論是在請致電Clear或打電話給FreeAndNil。訪問違規行爲也時有發生。

使用FastMM時,有時會報告「塊標題已損壞」。

內存分配或釋放時總是發生錯誤,即向列表添加內容並因此導致列表動態增長。

HandleList對象被傳遞給包的方式,並返回好嗎?是否有重要的知道包和內存管理?還是必須把錯誤放在別的地方?

編輯在錯誤可能在其他地方的情況下,我該如何調試這樣的東西?任何經驗?

+0

沒問題,也沒有問題。除非通用的東西在玩弄你。您使用的是什麼Delphi版本,以及您如何設置FastMM – 2010-02-22 11:06:10

+0

我正在使用D2010和FastMM的FullDebugMode。 – jpfollenius 2010-02-22 11:12:47

回答

3

我猜你正在編譯相同的代碼在不同的包中,也許在應用程序可執行文件中。無論您是將靜態運行包靜態鏈接(在項目選項中列出它們)還是動態鏈接(使用LoadPackage),每個單元都必須鏈接到一個模塊中,否則會出現重複的代碼衝突。檢查您的軟件包依賴關係(requires子句),主項目選項中的運行時軟件包列表,觀察關於隱式包含的單元的編譯器警告。

+0

那麼,在包'contains'子句和應用程序中都有一個單元'CommonStuff'是錯誤的嗎?有什麼選擇?不知道我是否完全理解你的答案。也許你可以更詳細地解釋它。謝謝! – jpfollenius 2010-02-22 11:46:37

+2

可以在應用程序中使用該單元,但項目必須使用包含該單元的運行時軟件包,否則將在可執行文件中再次鏈接單元。如果你使用更多的包,每個單元必須只在一個包中(包含子句)。任何其他使用同一單元的包必須參考原包(需要條款)。 – 2010-02-22 12:47:19

+0

感謝您的幫助!我現在開始工作了。 +1並被接受。 – jpfollenius 2010-02-23 09:46:41