2015-04-27 13 views
0

У меня есть C++ dll, которую я вызываю из кода C#. dll принимает пара параметров и возвращает int ..Утечка памяти при вызове C++ dll из C#

Код на 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

Что такое 'encodedTokenStr'? –

+0

выполняет некоторые операции, и окончательное кодированное значение сохраняется в этой строке, которая затем копируется в строку «buffer». Я добавил, что строка coz buffer является переменной out в методе C#. – Rasm

+0

Я имел в виду определить его в коде, в частности, я хочу увидеть тип и предыдущие распределения памяти –

ответ

0

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

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

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

На тангенциальной ноте я бы предложил использовать wchar_t в C++, чтобы сохранить полную совместимость с C# string с/char с/...

+0

Спасибо за ответ. моя главная проблема заключалась в построении строковых построек. всплески использования процессора, и приложение почти использует 10gb. – Rasm

+0

@ Распространение факта, что 10 строк C# + C++ не протекают, не означает, что другие 1000 строк не просачиваются :-) – xanatos

+0

да, я это понимаю. Я просто хотел проверить, правильно ли я обрабатываю свой код. C++ был разработан третьей стороной. мы должны будем просить о пересмотре и редактировании этого кода. что, скорее всего, будет моей следующей задачей, но прежде чем делать это, я просто хотел убедиться, что я не делаю ничего плохого в отношении того, как я вызываю DLL. – Rasm

 Смежные вопросы

  • Нет связанных вопросов^_^