我遇到了第三方C++ dll的內存泄漏問題。對於某些調用,dll爲字符串分配內存,將其作爲char *傳遞出去,然後希望將該指針接收回來,以便它可以取消分配內存。從C++接收char *到c#中,並再次將其傳回
以下是來自頭文件的一些註釋,一些char * get返回的示例以及「Release」方法的簽名。
(這個dll被稱爲SW_API,它來自一個交易結算所 - 如果任何人或許已經包裝了這個,我很樂意與他們交談!)。
/* Strings returned by the API are similarly normal nul-terminated C strings.
* The user should not attempt to change any of the bytes or read past the
* terminating nul of any returned string. All returned strings must be
* released using SW_ReleaseString() once the user is finished with the
* result. Failure to do this will result in memory leaks.
*/
/**
* @typedef const char* SW_XML
* @brief A string containing an XML documents text.
* @note As with all output strings, returned XML must be freed
* by the user. See @ref resource.
* @sa ErrorCodes
*/
typedef const char* SW_XML;
const char* STDAPICALLTYPE SW_GetLastErrorSpecifics();
SW_ErrCode STDAPICALLTYPE SW_DealGetSWML(SW_LoginID lh,
const char* swmlVersion,
SW_DealVersionHandle dealVersionHandle,
SW_XML* resultXML_out);
void STDAPICALLTYPE SW_ReleaseString(const char* buffer);
試圖從各種來源讀了,我已經試過如下:
// Extern declarations
[DllImport(sw_api_dll, EntryPoint = "[email protected]", CharSet = CharSet.Ansi)]
public static extern IntPtr SW_GetLastErrorSpecifics();
[DllImport(sw_api_dll, EntryPoint = "[email protected]", CharSet = CharSet.Ansi)]
public static extern int SW_DealGetSWML(int lh, string swmlVersion, string dealVersionHandle, [Out] out IntPtr outputSWML);
[DllImport(sw_api_dll, EntryPoint = "[email protected]", CharSet=CharSet.Ansi)]
public static extern void SW_ReleaseString(IntPtr buffer);
// Using the externs.
private static string GetIntPtrStringAndRelease(IntPtr ptr)
{
string result = Marshal.PtrToStringAnsi(ptr);
API.SW_ReleaseString(ptr);
return result;
}
public static int SW_DealGetSWML(int lh, string swmlVersion, string dealVersionHandle, ref string outputSWML)
{
IntPtr outputSWML_out = new IntPtr();
int result = API.SW_DealGetSWML(lh, swmlVersion, dealVersionHandle, out outputSWML_out);
outputSWML = GetIntPtrStringAndRelease(outputSWML_out);
return result;
}
public static string SW_GetLastErrorSpecifics()
{
IntPtr ptr = API.SW_GetLastErrorSpecifics();
return GetIntPtrStringAndRelease(ptr);
}
看來我只是不能得到API釋放繩線。
現在,這可能只是API中的一個錯誤,但我對此表示懷疑。 更可能是我做了一些錯誤的事情。
我所知道的是,我的工作組只是不斷增長。
有問題的公司提供Java包裝,但不會延伸到.Net包裝。
任何幫助最感激地收到。
Brett。
這看起來像API中的一個bug。如果你回來的數據(即從'GetIntPtrStringAndRelease'返回的值是好的),那麼這應該工作。 – 2011-03-14 22:26:55
'GetIntPtrStringAndRelease'對我來說看起來不錯。 – 2011-03-14 22:32:19
我回來的價值很好。我幾乎希望它不是! – Brett 2011-03-15 19:03:40