字符串到Char*没有内存泄漏

String to Char* Without memory leaks

本文关键字:内存 泄漏 Char 字符串      更新时间:2023-10-16

我尝试了很多方法将字符串转换为Char*,但当我将DLL导入C#项目时,总是遇到两个错误。我的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);

并将其传递给CCD_ 2。

我试着这样做:

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);

并且您根本不需要任何CCD_ 3。

.NET和p/invoke对std::string一无所知。