Утечки памяти при вызове C ++ dll из C #

У меня есть 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 ++.
может ли этот строитель строк вызывать утечки памяти ??

0

Решение

C # не освобождает память, выделенную C ++ (за некоторыми небольшими исключениями, если вы используете COM allocators / BSTR).

В вашем конкретном случае

Я не вижу никаких проблем в вашем случае. В коде C ++ нет выделения памяти, и StringBuilder «встроен» в C # и имеет размер 10000 символов, я надеюсь, что этого достаточно (обратите внимание, что обычно вы передаете C ++ размер буфера, или вы сначала спросите у другого метода C ++ размер необходимого буфера).

На касательной ноте я бы предложил использовать wchar_t в C ++ для обеспечения полной совместимости с C # strings /chars / …

0

Другие решения


По вопросам рекламы [email protected]