繁体   English   中英

从C#调用C ++ dll时出现内存泄漏

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM