簡體   English   中英

C ++回調函數中的內存泄漏

[英]Memory Leak in C++ CallBack Function

我是C ++的初學者,目前我正在編寫用於CallBack函數的代碼,以從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的壽命是多長? 尚不清楚它是否是類的一部分,或者是否要復制到全局數組中,這可能會使管理其生命周期充其量很困難。

切換到使用類似std::vector的容器,該容器將為您處理為傳感器值分配的內存,或者使用共享指針(如std::unique_ptr<float []>初始化動態數組。 閱讀RAII /內存管理及其工作原理非常重要,因為這是C ++的關鍵概念。

如果您使用的是“真正的” c ++,而不是.Net的,則應該用“刪除”釋放分配給“新”的每個內存塊。

即:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM