如何释放Gdiplus :: Bitmap :: FromFile分配的内存

时间:2015-12-01 04:55:35

标签: c++ windows winapi memory-leaks gdi+

如果我使用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 + bitmaps存在问题,但是执行:: delete的解决方案并没有让它变得更好。与我见过的解决方案不同,我不是使用new来创建位图,而是使用“FromFile”。

此外,正如您所看到的,我没有使用我没有使用“命名空间Gdiplus”,因此命名空间不在范围内,我需要明确地引用它(这可能会改变一些事情)。

1 个答案:

答案 0 :(得分:1)

创建位图对象并删除它的方式是正确的。您的程序中有另一个缺陷,它负责堆损坏。您需要找到该缺陷并进行修复。

堆腐败可能令人困惑。缺陷可以在代码的一部分中,但运行时错误仅发生在代码的不同的,通常不相关的部分中。它们很难调试,你可能会找到一个有用的工具来帮助它:Is there a good Valgrind substitute for Windows?