回调函数中的内存泄漏C++

Memory Leak in C++ CallBack Function

本文关键字:泄漏 C++ 内存 函数 回调      更新时间:2023-10-16

我是C++初学者,目前我正在为回调函数编写代码以从 CLI 包装器连续获取字节数组。我的代码

    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包装类从C#接收字节数据,并传递给C++应用程序以显示图像帧。 当我调用GetSensor1VerticesFromCSharp函数时,系统内存在10分钟后增加,系统挂起。请建议我解决这个问题。

谢谢基鲁巴

sensor1camevalues 的寿命是多少?目前尚不清楚它是类的一部分,还是要复制到全局数组中,这最多只能使管理它的生命周期变得困难。

切换到使用像 std::vector 这样的容器,它将为您处理为传感器值分配内存,或者使用共享指针(如 std::unique_ptr<float []>)来初始化动态数组。阅读RAII/内存管理及其工作原理非常重要,因为这是C++的关键概念。

如果你

是关于"真正的"c ++,而不是.Net one,你应该用"删除"来释放每个分配有"new"的内存块。

即:

sensor1camevalues=new float[length]; // memory allocation
delete[] sensor1camevalues; // deallocation