2012-02-20 92 views
0

我有大量的C代碼,我需要在C#中使用。例如:C中的免費C分配內存#

long foo(char** mystring); 
void free_string(char* mystring); 

foo()使用malloc()mystring分配內存。我已經嘗試了幾種從C#中調用這個函數的方法,但我沒有釋放mystring。您能否請給我一些關於如何撥打foo()的指導方針,以便我以後可以免費撥打mystring

例如,如果char**StringBuilder[]表示,那麼我怎樣才能使用它在free_string()中被釋放?

+2

究竟你是如何調用C代碼?我們可以舉一些你的嘗試代碼嗎?你的問題目前的狀況太模糊,無法準確回答。 – 2012-02-20 09:18:46

+0

在本地分配內存以便在託管中釋放相當多的開銷,以確保調用者完全知道他們在做什麼,您可能需要考慮其他技術來分配託管代碼中的內存,例如像這樣的http:// stackoverflow .com/questions/8425501/how-can-i-pass-an-empty-string-buffer-that-c​​an-be-written-to-from-native-to-c – dice 2012-02-20 09:23:44

+0

我試着調用幾個C代碼方式,但我對他們中的任何一個都沒有信心。例如:我試過 'static extern long foo( [MarshalAs(UnmanagedType.LPArray,ArraySubType = UnmanagedType.LPStr)] StringBuilder [] mystring);' 我試着'IntPtr ptr'而不是'StringBuilder'和Marshal.FreeCoTaskMem(ptr)。這是行不通的 – pdp11 2012-02-20 09:31:56

回答

0

如果您在kernel32.dll中使用LocalAlloc分配內存,則可以使用Marshal.FreeHGlobal(IntPtr)來釋放內存。雖然你不能免費malloc'ed內存。

雖然你不能釋放malloc與它的內存。作爲另一種解決方案,考慮傳遞C#StringBuilder引用並用C代碼填充它。

也看看MSDN article on memory models

1

在本地分配內存以便在託管中釋放相當的開銷,以確保調用者完全知道他們在做什麼,您可能需要考慮其他技術來分配託管代碼中的內存。

一個例子可能是使一個回調到託管代碼來獲得一個字符串緩衝區

extern "C" __declspec void GetString(char* buffer, int bufferSize); 

匹配C#是以下幾點:

void GetString(StringBuilder buffer, int bufferSize);