[英]Memory Leaks while calling C++ dll from C#
我有一个从C#代码调用的C ++ dll。 dll接受几个参数并返回一个int。
C ++代码。
extern "C" __declspec(dllexport) int DoSomething(char* input1, char* buffer)
{
gss_buffer_desc token;
std::string encodedTokenStr = base64_encode((unsigned char *)token.value, token.length).c_str();
std::copy(encodedTokenStr.begin(), encodedTokenStr.end(), buffer);
return value;
}
C#
public sealed class MyClass
{
public int DoSomething(string input1, out StringBuilder buffer)
{
buffer = new StringBuilder(10000);
return DoSomething(input1, buffer)
}
[DllImport("mycppcode.dll")]
private static extern int DoSomething(string input1, StringBuilder buffer)
}
有时我看到此应用程序正在使用大量内存,而我的第一个念头是关于内存泄漏。 垃圾收集器是否照顾在C ++代码中初始化的所有对象? C ++代码是否为字符串生成器(“缓冲区”)初始化了一些内存,即使它是在C#中初始化的也是如此。 我不能在C ++中处理它,因为我需要从字符串生成器中收集数据。
我从未使用过C ++,但是我看到在C ++ dll中声明的对象很少被清除。
我在调用C ++代码的方式上可能做错了。 这个字符串生成器会导致内存泄漏吗?
C#不会释放C ++分配的任何内存(如果使用COM分配器/ BSTR,则有一些小例外)。
在您的特定情况下
我认为您的情况没有任何问题。 C ++代码中没有内存分配,并且StringBuilder是在C#端“构建”的,并且有10000个字符大,我希望这样就足够了(请注意,通常您会将缓冲区的大小传递给C ++,否则您将首先请问另一个C ++方法所需缓冲区的大小)。
切记,我建议在C ++中使用wchar_t
来保持与C# string
s / char
s /的完全兼容性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.