我是C ++的初学者,目前我正在编写CallBack函数代码,以便从CLI Wrapper连续获取Bytes数组。我的代码
C++
**Declaration:**
void ReceivedSensor1ByteArray(unsigned char values[], int length);
**Calling:**
GetSensor1ColorsFromCsharp(&ReceivedSensor1ByteArray);
**Definition:**
byte* sensor1bytevalues;
void ReceivedSensor1ByteArray(unsigned char values[], int length)
{
if(length > 0)
{
sensor1bytevalues=new byte[length];
for(int i = 0; i < length; i++)
{
sensor1bytevalues[i]=values[i];
}
}
}
**CLI Wrapper**
**Decalration:**
public ref class SampleWrapper
{
SampleWrapper(void)
{
kinectSocketwrapperObj->ReadBytesValues+=gcnew CLIWrapperClass::ByteValuesReady(this,&Wrapper::SampleWrapper::ByteArrayReadyMethod);
}
public:
CLIWrapperClass ^ kinectSocketwrapperObj;
static SampleWrapper ^ Instance = gcnew SampleWrapper();
void ByteArrayReadyMethod(array<Byte> ^ values);
**Definition:**
GetByteArrayCallback byteArrayCallback;
__declspec(dllexport) void GetSensor1ColorsFromCsharp(GetByteArrayCallback cb)
{
byteArrayCallback = cb;
CLIWrapperClass ^KinectServerWrapper = SampleWrapper::Instance->kinectSocketwrapperObj;
KinectServerWrapper->ReceiveSensor1colors();
}
void SampleWrapper::ByteArrayReadyMethod(array<Byte> ^ values)
{
Byte *nativeValues = new Byte[values->Length];
copyManagedByteToUnfloatArray(nativeValues, values);
byteArrayCallback(nativeValues, values->Length);
}
void copyManagedByteToUnfloatArray(Byte target[], array<Byte> ^ values)
{
int maxSize = values->Length;
if ( maxSize > 0)
{
for (int index = 0; index < maxSize; index++ )
{
target[index] = (float)values[index];
}
}
}
实际上我通过CLI Wrapper类从C#接收字节数据并传递给C ++应用程序以显示DisplayImageFrame。当我继续调用GetSensor1VerticesFromCSharp函数时,系统内存在10分钟后增加,系统被挂起。请建议我解决这个问题。
谢谢, Kirubha
答案 0 :(得分:1)
sensor1camevalues的生命周期是什么?它不清楚它是否是一个类的一部分,或者你是否正在复制到一个全局数组中,这可能会使它的生命周期变得困难。
切换到使用像std::vector
这样的容器,它将处理为您分配传感器值的内存,或者使用像std::unique_ptr<float []>
这样的共享指针初始化动态数组。阅读RAII /内存管理及其工作原理非常重要,因为这是C ++的一个关键概念。
答案 1 :(得分:0)
您应该免费使用&#34;删除&#34;每一块内存分配有&#34; new&#34;,如果你是关于&#34; true&#34; c ++,而不是.Net one。
I.e。:
sensor1camevalues=new float[length]; // memory allocation
delete[] sensor1camevalues; // deallocation