簡體   English   中英

字符串到Char **,不會發生內存泄漏

[英]String to Char* Without memory leaks

我嘗試了多種方法將字符串轉換為Char *,但是將DLL導入C#項目時始終遇到2個錯誤。 我的C ++ DLL的主要功能是這樣的:

//Example
extern "C" __declspec (dllexport) void Conv(std::string str)
{
    FFileList file_list;

    char temp_path[1024];
    sprintf(temp_path,"%s*",arg_path);

    GetFindFileListWin(temp_path,".mrs",file_list);

}

因此,我需要將“ str”轉換為char *,因為GetFindFileListWin如下所示:

GetFindFileListWin(char* path,char* ext,FFileList& pList);

並將其傳遞給arg_path

我試圖這樣做:

char* arg_path = new char[str.length()+1];
strcpy(arg_path, str.c_str());
sprintf(temp_path,"%s*",arg_path);
delete[] arg_path;

但是當我在C#程序中運行Conv()時,它說Windows在Program.exe中觸發了一個斷點。 這可能是由於堆損壞所致,這表明Program.exe或其已加載的任何DLL中存在錯誤。 (如果使用_strdup,也會發生同樣的情況)。 因此,我嘗試了其他方式:

std::vector<char> Chr(str.size() + 1);
std::copy(str.begin(), str.end(), Chr.begin());
char *arg_path = &Chr[0];
sprintf(temp_path,"%s*",arg_path);

而且我嘗試讀取或寫入受保護的內存消息

我的C#程序這樣做:

[DllImport("Mrs.dll")]
public static extern void Conv(string str);
public void Convert(TextBox Tx)
{
  Conv(Tx.Text);
}

希望有人能幫助我解決此錯誤,在此先謝謝您。

我懷疑sprintf語句中的星號可能是導致此問題的原因。 sprintf期望格式字符串中星號的長度參數。

sprintf(temp_path,"%s*",arg_path);
                     ^

字符串是c ++對象。因此在dll中將不起作用

正如我上面提到的,您應該做的就是這樣做

extern "C" __declspec (dllexport) void Conv(const char* str)
{
   //do whatever
}

如果您的p / invoke簽名是

[DllImport("Mrs.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern void Conv(string str);

那么您的C ++聲明將很簡單

extern "C" __declspec(dllexport) void Conv(const char* str);

而且您根本不需要任何std::string

.NET和p / invoke對std::string一無所知。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM