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

时间:2016-01-25 08:11:12

标签: c# c++ memory-management memory-leaks command-line-interface

我是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

2 个答案:

答案 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