2015-12-01 2 views
1

Если я использую delete или :: delete, я получаю исключение C++. Конечно, я могу просто отпустить его без удаления, и это нормально, но утечка памяти будет очень быстро расти.Как освободить память, выделенную Gdiplus :: Bitmap :: FromFile

Мой код выглядит следующим образом: (в том числе все, что связано с GDI +, которые могут иметь отношение)

#include <windows.h> 

#ifdef max 
#undef max 
#endif 
#ifdef min 
#undef min 
#endif 

namespace Gdiplus 
{ 
    using std::min; 
    using std::max; 
} 
#include <gdiplus.h> 
#pragma comment (lib,"Gdiplus.lib") 

namespace Infra 
{ 
    namespace Color 
    { 
     //more app code 


     void CrashingMethod(...) 
     { 
      Gdiplus::Bitmap* bitmap = Gdiplus::Bitmap::FromFile(PNG_PATH); 

      //read bitmap 
      int qpWidth = frameWidth/16; 
      Gdiplus::Color color = Gdiplus::Color(); 

      for (unsigned int y = 0, qy = (frameHeight/16) - 1; y < frameHeight; y += 16, qy--) 
      { 
       for (unsigned int x = 0, qx = 0; x < frameWidth; x += 16, qx++) 
       { 
        bitmap->GetPixel(x, y, &color); 

        byte red = color.GetRed(); 

        //do stuff with the red channel 

       } 
      } 

      delete bitmap; //this line will randomly crash. Not always, not in all machines 
      bitmap = NULL; 
     } 
    } 


    } 
} 

Что такое правильный способ освободить это? Я знаю, что есть проблемы с удалением растровых изображений gdi +, но решение делать: delete не делает его лучше. В отличие от решений, которые я видел, я не использую новое для создания растрового изображения, но «FromFile».

Кроме того, как вы можете видеть, я не использую Я не использую «пространство имен Gdiplus», поэтому пространство имен не входит в область действия, и мне нужно явно ссылаться на него (что может изменить ситуацию).

+0

Подождите, вы * не * используете пространство имен Gdiplus с кодом, заполненным 'Gdiplus ::' и включающим ''? Что вы используете вместо этого? Если вы уверены, что не используете пространство имен, вам придется посмотреть, что вы используете вместо этого. – andlabs

+1

Объекты Gdi +, такие как Bitmap, которые выводятся из GdiPlusBase, предназначены для управления с помощью новых и удаления. Кажется более вероятным, что у вас есть память, переполненная в другом месте, которая развращает кучу, что приводит к случайному сбою при освобождении. –

+0

andlabs. Я должен перефразировать. Я не использую «пространство имен Gdiplus», поэтому пространство имен не входит в область действия, и мне нужно явно ссылаться на него. WIll исправить это в описании – cloudraven

ответ

1

Способ создания растрового объекта и его удаление. У вас есть еще один дефект в вашей программе, который несет ответственность за повреждение кучи. Вам нужно найти этот дефект и исправить его.

Недостатки кучи могут быть запутанными. Дефект может быть в одной части кода, но ошибка времени выполнения возникает только в другой, часто не связанной части кода. Их трудно отладить, и вы можете найти полезный для этого инструмент: Is there a good Valgrind substitute for Windows?

+0

Это было повреждение кучи, и это на самом деле в этом цикле в коде. qy опускался ниже 0, будучи неподписанным, переходящим к высокому значению, больше, чем массив, с которым я обращался. Спасибо – cloudraven

Смежные вопросы