Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中管理返回的字符串指针#_C#_C++_.net_C - Fatal编程技术网

C# 在C中管理返回的字符串指针#

C# 在C中管理返回的字符串指针#,c#,c++,.net,c,C#,C++,.net,C,因此,我创建了一个用C/C++编写的名为FileGuidUtils.dll的自定义dll,其中一个函数返回一个WCHAR*字符串(作为C#中的LPWStr)。此字符串获取类型为(WCHAR*)的函数内分配的堆内存 现在我只使用返回的字符串,就这样。我应该把它放在C#的某个地方吗?如果是,我应该使用什么代码?还是CLR垃圾收集器为我处理 [DllImport(@"FileGuidUtils.dll", CallingConvention = CallingConvention.Cdecl,

因此,我创建了一个用C/C++编写的名为FileGuidUtils.dll的自定义dll,其中一个函数返回一个WCHAR*字符串(作为C#中的LPWStr)。此字符串获取类型为(WCHAR*)的函数内分配的堆内存

现在我只使用返回的字符串,就这样。我应该把它放在C#的某个地方吗?如果是,我应该使用什么代码?还是CLR垃圾收集器为我处理

    [DllImport(@"FileGuidUtils.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
    [return: MarshalAs(UnmanagedType.LPWStr)]
    private static extern string getReparseTarget([MarshalAsAttribute(UnmanagedType.LPWStr)] string linkPath);

我偶尔会遇到未处理的内存不足异常,但无法查明原因,因为我不经常遇到。现在我只想知道我是否正确处理了返回的字符串?

您正在创建内存泄漏。NET无法释放内存,如“代码> MalCal,C++ >代码> NeX/COD>或任何其他分配程序,因为它不知道使用了哪个分配器(这有一些例外)。 可能的解决办法:

1) 返回一个
IntPtr

private static extern IntPtr getReparseTarget([MarshalAsAttribute(UnmanagedType.LPWStr)] string linkPath);
并有相应的

private static extern void freeMemory(IntPtr ptr);
然后使用
PtrToStringUni()

2) 具有返回所需长度的函数,然后传递该长度的
StringBuilder
new StringBuilder(len)
):

3) 使用
marshallas(UnmanagedType.BSTR)


CLR自动释放分配为BSTR的字符串。请注意,您需要将它们创建为BSTR C++端(使用
SysAllocString
/
SysAllocStringLen
)。

请参阅。您所做的是错误的,并且会导致内存泄漏。我所做的与他并不完全相似,我使用malloc进行分配,与他不同的是,我能够使用返回的字符串。我只是担心会发生泄漏。不管怎样,我会仔细阅读,但如果你能更具体一点,我将不胜感激
private static extern int getReparseTargetLength([MarshalAsAttribute(UnmanagedType.LPWStr)] string linkPath);

private static extern void getReparseTarget([MarshalAsAttribute(UnmanagedType.LPWStr)] string linkPath, [MarshalAsAttribute(UnmanagedType.LPWStr)] StringBuilder output, int maxLen);
[return: MarshalAs(UnmanagedType.BSTR)]
private static extern string getReparseTarget([MarshalAsAttribute(UnmanagedType.LPWStr)] string linkPath);