0

我有一个从 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++ 代码的方式上可能做错了什么。这个字符串生成器会导致内存泄漏吗?

4

1 回答 1

0

C# 不会释放 C++ 分配的任何内存(如果使用 COM 分配器/BSTR,则有一些小例外)。

在您的具体情况下

我认为你的情况没有任何问题。C++ 代码中没有内存分配,并且 StringBuilder 是“内置”C# 端,并且有 10000 个字符大,我希望它足够了(请注意,通常你会将缓冲区的大小传递给 C++,或者你会首先向另一个 C++ 方法询问所需缓冲区的大小)。

顺便说一句,我建议wchar_t在 C++ 中使用,以保持与 C# strings/ chars/...的完全兼容性

于 2015-04-27T18:31:55.380 回答