2015-04-27 46 views
0

我有一個C++ dll,我從C#代碼調用。 該DLL需要在幾個參數,並返回一個int ..從C#調用C++ dll時內存泄漏

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」。我補充說,line coz buffer是C#方法中的一個輸出變量。 – Rasm

+0

我的意思是在代碼中定義它,具體來說,我想看看類型,以及之前的內存分配 –

回答

0

C#沒有釋放由C++分配的任何內存(如果使用COM分配器/ BSTR,有一些小例外)。

在您的具體情況

我沒有看到你的情況有任何問題。在C++代碼中沒有內存分配,並且StringBuilder是「內置的」C#端,並且是10000個字符,我確實希望它足夠了(注意,通常你會傳遞給C++緩衝區的大小,或者你會首先向另一個C++方法詢問所需緩衝區的大小)。

在切線說明,我會建議在C++使用wchar_t,保持與C#string S/char的全兼容/ ...

+0

感謝您的回答。我主要關心的是字符串生成器。 CPU使用率高峯和應用程序幾乎使用10GB。 – Rasm

+0

@Rasm事實上,10行C#+ C++不泄漏並不意味着其他1000行不泄漏:-) – xanatos

+0

是的,我明白這一點。我只是想檢查是否正在處理我的代碼。 C++是由一些第三方開發的。我們將不得不請求審查和編輯該代碼。這很可能將成爲我的下一個任務,但在此之前,我只是想確保我對於如何調用dll沒有任何錯誤。 – Rasm