如何释放 Gdiplus::Bitmap::FromFile 分配的内存
How to free the memory allocated by Gdiplus::Bitmap::FromFile
如果我使用 delete 或 ::delete,我会得到一个 C++ 异常。
当然我可以不删除就让它过去,这很好,但是内存泄漏会很快累积起来。
我的代码如下:(包括与 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 的解决方案并没有使它变得更好。与我看到的解决方案不同,我没有使用 new 来创建位图,而是 "FromFile"。
此外,如您所见,我没有使用 我没有使用 "namespace Gdiplus" 所以命名空间不在范围内,我需要明确引用它(这可能会改变事情)。
您创建和删除位图对象的方式是正确的。您的程序中还有另一个导致堆损坏的缺陷。您需要找到该缺陷并修复它。
堆损坏可能令人困惑。缺陷可能出现在代码的一部分中,但运行时错误只会发生在代码的另一部分,通常是不相关的部分。它们很难调试,您可能会找到一个有用的工具来帮助解决这个问题:Is there a good Valgrind substitute for Windows?
如果我使用 delete 或 ::delete,我会得到一个 C++ 异常。 当然我可以不删除就让它过去,这很好,但是内存泄漏会很快累积起来。
我的代码如下:(包括与 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 的解决方案并没有使它变得更好。与我看到的解决方案不同,我没有使用 new 来创建位图,而是 "FromFile"。
此外,如您所见,我没有使用 我没有使用 "namespace Gdiplus" 所以命名空间不在范围内,我需要明确引用它(这可能会改变事情)。
您创建和删除位图对象的方式是正确的。您的程序中还有另一个导致堆损坏的缺陷。您需要找到该缺陷并修复它。
堆损坏可能令人困惑。缺陷可能出现在代码的一部分中,但运行时错误只会发生在代码的另一部分,通常是不相关的部分。它们很难调试,您可能会找到一个有用的工具来帮助解决这个问题:Is there a good Valgrind substitute for Windows?