【问题标题】:Memory Leak in C++ CallBack FunctionC++ 回调函数中的内存泄漏
【发布时间】:2016-01-25 08:11:12
【问题描述】:

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

    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 分钟后增加,系统被挂起。请建议我解决这个问题。

谢谢, 基鲁巴

【问题讨论】:

  • sensor1camevalues 它只是一个变量,我会正确清除它。实际上我认为 CallBack 函数占用了太多内存“ typedef void (*GetByteArrayCallback) (unsigned char values[], int length);” __declspec(dllexport) void GetSensor1ColorsFromCsharp(GetByteArrayCallback cb);建议我如何清除回调函数

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


【解决方案1】:

sensor1camevalues 的生命周期是多久?目前尚不清楚它是否是类的一部分,或者您是否正在复制到全局数组中,这可能会使管理它的一生变得困难。

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

【讨论】:

    【解决方案2】:

    如果你是关于“真正的”c++,而不是 .Net 的,你应该用“删除”释放每个用“新”分配的内存块。

    即:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 2019-09-07
      • 2020-09-19
      • 1970-01-01
      相关资源
      最近更新 更多