首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何释放由Gdiplus::位图::FromFile分配的内存

如何释放由Gdiplus::位图::FromFile分配的内存
EN

Stack Overflow用户
提问于 2015-12-01 04:55:34
回答 1查看 2.2K关注 0票数 4

如果使用delete或:delete,则会得到C++异常。当然,我可以在不删除的情况下让它继续进行,这是很好的,但是内存泄漏会很快积累起来。

我的代码如下:(包括与gdi+相关的任何可能相关的内容)

代码语言:javascript
运行
复制
#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”,所以名称空间不在范围内,我需要显式地引用它(这可能会改变事情)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-01 09:22:57

创建位图对象并删除它的方式是正确的。您的程序中还有另一个导致堆损坏的缺陷。你需要找到那个缺陷并修复它。

堆损坏可能会令人困惑。缺陷可以出现在代码的一个部分中,但运行时错误只发生在代码的另一个(通常是无关的)代码中。它们很难调试,您可能会发现有一个工具对此很有用:Is there a good Valgrind substitute for Windows?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34012880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档