Если я использую 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», поэтому пространство имен не входит в область действия, и мне нужно явно ссылаться на него (что может изменить ситуацию).
Подождите, вы * не * используете пространство имен Gdiplus с кодом, заполненным 'Gdiplus ::' и включающим ''? Что вы используете вместо этого? Если вы уверены, что не используете пространство имен, вам придется посмотреть, что вы используете вместо этого. –
andlabs
Объекты Gdi +, такие как Bitmap, которые выводятся из GdiPlusBase, предназначены для управления с помощью новых и удаления. Кажется более вероятным, что у вас есть память, переполненная в другом месте, которая развращает кучу, что приводит к случайному сбою при освобождении. –
andlabs. Я должен перефразировать. Я не использую «пространство имен Gdiplus», поэтому пространство имен не входит в область действия, и мне нужно явно ссылаться на него. WIll исправить это в описании – cloudraven