У меня есть C ++ DLL, который я звоню из кода C #.
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 allocators / BSTR).
В вашем конкретном случае
Я не вижу никаких проблем в вашем случае. В коде C ++ нет выделения памяти, и StringBuilder «встроен» в C # и имеет размер 10000 символов, я надеюсь, что этого достаточно (обратите внимание, что обычно вы передаете C ++ размер буфера, или вы сначала спросите у другого метода C ++ размер необходимого буфера).
На касательной ноте я бы предложил использовать wchar_t
в C ++ для обеспечения полной совместимости с C # string
s /char
s / …