簡體   English   中英

C#使用的本機C ++庫的內存分配器

[英]Memory allocators for a native C++ library to be used by C#

我正在編寫一些需要從C#調用的本地C ++代碼(而且我無法用C#代碼替換C ++本地代碼)。

我在使用malloc / free分配/取消分配本機C ++代碼中的某些內存時發現內存損壞。 然后,我使用了LocalAlloc / LocalFree和HeapAlloc / HeapFree,並遇到了相同的問題。

分配/取消分配似乎是正確的,它們發生在由本機代碼創建的單獨線程中。

我想知道哪種是在C#調用的本機C ++庫中使用的最佳分配策略

編輯:發現了問題:問題不在分配/解除分配代碼中,而是在釋放后寫入的某些內存中。

只要代碼的C#端使用編譯器的/unsafe開關和用於保存數據緩沖區的fixed關鍵字,我認為您就可以了。

至於您的內存分配問題,可能不是導致問題的C ++內存分配代碼,可能是C ++代碼與驅動程序交互的方式...也許按照以下方式使用VirtualAlloc / VirtualFree對: MSDN文檔...

編輯:當您嘗試分配緩沖區以與驅動程序進行交互后從C ++端保存數據時...競爭條件或中斷延遲可能會導致內存損壞...只是一個想法...

希望這對您有所幫助,湯姆,謝謝。

您的問題缺少基本細節,還不清楚是否需要在C#端釋放C ++代碼分配的內存。 通常,這是使用CLR中的P / Invoke編組器或COM互操作層自動完成的。 或者可以通過將方法參數聲明為IntPtr,然后使用Marshal類來手動完成。

如果自動完成,則必須使用COM內存分配器CoTaskMemAlloc()。 如果您自己編組,則也可以使用GlobalAlloc(),並通過Marshal.FreeHGlobal()在C#一側發布。 使用GlobalAlloc()沒有任何優勢,您最好使用CoTaskMemAlloc()並與Marshal.FreeCoTaskMem()一起發布。

但是您應該自己注意到這一點。 如果托管代碼釋放內存,則在C ++端使用malloc()或HeapAlloc()分配將導致泄漏而不是損壞。 Vista和Win7具有更嚴格的堆管理器,如果發現發行錯誤,它將終止程序。

在我看來,您的C ++代碼中有簡單的堆損壞。 這是非托管C ++編程最常見的禍害,即溢出緩沖區的末端,寫到已釋放的內存,錯誤的指針值。 消除此類錯誤的方法是仔細檢查代碼並使用調試分配器,例如<crtdbg.h>提供的調試分配器。 祝你好運。

Windows驅動程序開發工具包建議不要將C ++用於驅動程序。

最好的策略也是讓驅動程序管理自己的內存。 當C#需要查看數據時,然后將其傳遞給編組的緩沖區並讓驅動程序填充它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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