c++内存泄漏向c#代码传递字符串
C++ Memory Leak Passing a string to C# code
我们有一个c#应用程序,它使用回调方法从c++项目接收数据:
/* c# code */
call[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private unsafe delegate void NewFrame(string serial, Int32* width, Int32* height, short* frame);
在我们的c++项目中(从相机接收数据),我们经常调用这个'NewFrame'回调方法,将相机帧传递给c#代码。
这个方法在c++中的定义是:
/* c++ code */
typedef void (__stdcall * NewFrame)(char* serialnumber, INT32* width,INT32* height, int16_t* frame);
在c++代码中将c++字符串对象转换为char*时传递'serial':
/* c++ code */
char* stringToCsharpString(string s){
char* cserial = new char[s.length() + 1];
strcpy(cserial, s.c_str());
return cserial;
}
但是,这会导致(堆)内存泄漏,因为cserial对象没有被释放。
下面是c++中调用NewFrame方法的方式:/* c++ code */
newFrame(stringToCsharpString(node.getSerialNumber()), &w, &h, data.frame);
我们能做些什么来解决这个问题?我们精通c#,但对c++却一窍不通。所以在讨论c++代码时,请详细解释:)
为了将c++中的非托管内存转换为c#中的托管内存,可以使用gcnew:
String^ ConvertUnmanagedString2ManagedString(char* cserial)
{
return gcnew String(cserial)
}
在这里,我假设你的cserial内容编码是UCS-2。我不知道cserial的内容是什么,但如果它是用UTF8或UCS-2以外的其他编码编码,你还需要应用文本编码转换,因为c#字符串编码是UCS-2。
相关文章:
- 编译包含字符串的代码时遇到问题
- 为什么这个 c++ 代码打印出长度 5,当我打印出字符串时,程序会自动终止?
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 我无法在 qt 的C++代码中定义字符串
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 有人可以解释一下这段代码如何能够反转字符串
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 我遇到了这个代码片段,不明白. 它递归检查 C++ 字符串中是否存在大写字符
- 如何用符合C++核心准则的代码替换C风格的字符串解析
- C++/CLI访问字符串::来自非CLI代码的格式
- MSVC UTF8字符串编码使用了不正确的代码点
- C++指向对象的指针堆数组中,如何将字符串传递给特定对象?有一些代码请看一下:
- 将浮点数转换为字符串时如何加快此代码的速度?
- C++代码,用于在用户插入的字符串的每个元音之后插入一对字符
- 如何获取包含 NULL 字符的外壳代码字符串的长度
- 字符串代码不起作用
- C++字符串代码点和代码单元的任何良好解决方案
- 输入验证,需要数字,而不是字符串.代码导致无限循环
- 使用引用传递方法的反向字符串代码不起作用
- 这个反向字符串代码正确吗