字符串到 Char* 没有内存泄漏
Posted
技术标签:
【中文标题】字符串到 Char* 没有内存泄漏【英文标题】:String to Char* Without memory leaks 【发布时间】:2013-12-10 18:16:36 【问题描述】:我尝试了多种方法将字符串转换为 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);
希望有人能帮我解决这个错误, 提前致谢。
【问题讨论】:
看看这个:std::string::c_str()
声明你的 c 函数,比如 void Conv(const char* str) 并使用它
不要在 dll api 中使用 stl 容器(不同的编译器为此创建不同的二进制文件)。我什至不认为您可以将 extern "C" 用于接受 std::string 的方法,因为 string 不再是 "C"。不要期望 C# 能够在没有任何编组的情况下将 .net 字符串传递给 Conv(const char*)。最后但同样重要的是,.net 肯定有更好的工具,你可以重写你的 GetFindFileListWin 方法。
【参考方案1】:
我怀疑 sprintf 语句中的星号可能会导致问题。 sprintf 需要格式字符串中星号的长度参数。
sprintf(temp_path,"%s*",arg_path);
^
【讨论】:
其实你在想%*s
。在显示的代码中,*
只是一个文字字符,将在没有特殊处理的情况下输出。 (结果,它在问题中显示的几个代码 sn-ps 中超出了缓冲区)【参考方案2】:
字符串是 c++ 对象。所以在 dll 中它不会工作
你应该按照我上面提到的那样去做
extern "C" __declspec (dllexport) void Conv(const char* str)
//do whatever
【讨论】:
【参考方案3】:如果你的 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
一无所知。
【讨论】:
我之前尝试过以其他方式使用 Marshaling,但我失败了,但实际上这与 @suspectus 答案结合使用非常好。非常感谢您,先生。以上是关于字符串到 Char* 没有内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章