c++内存泄漏向c#代码传递字符串

本文关键字:字符串 代码 内存 泄漏 c++ | 更新日期: 2023-09-27 18:18:32

我们有一个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#代码传递字符串

为了将c++中的非托管内存转换为c#中的托管内存,可以使用gcnew:

String^ ConvertUnmanagedString2ManagedString(char* cserial)
{
     return gcnew String(cserial)
}

在这里,我假设你的cserial内容编码是UCS-2。我不知道cserial的内容是什么,但如果它是用UTF8或UCS-2以外的其他编码编码,你还需要应用文本编码转换,因为c#字符串编码是UCS-2。