【问题标题】:Access violation in Image destructor图像析构函数中的访问冲突
【发布时间】:2010-07-28 23:00:31
【问题描述】:

我可能会说一个非常简单的程序..

#include <windows.h>
#include <gdiplus.h>

using namespace Gdiplus;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR cmdLine, int nShow){
    // Gdiplus variables
    GdiplusStartupInput mGdiplusStartupInput;
    ULONG_PTR           mGdiplusToken;
    GdiplusStartup(&mGdiplusToken, &mGdiplusStartupInput, NULL);

    Bitmap bitmap(L"left.bmp");


    GdiplusShutdown(mGdiplusToken);
    return 0;
}

运行此示例时,我在此函数的 GdiplusBitmap.h 中遇到访问冲突

inline 
Image::~Image()
{
    DllExports::GdipDisposeImage(nativeImage);
}

通过删除对Bitmap bitmap(L"left.bmp"); 的调用,一切正常。我试图在msdn 上找到一个简单的例子(例如Bitmap constructor 附近的某个地方,但没有找到任何东西。)

我错过了什么?

【问题讨论】:

    标签: windows visual-studio-2008 gdi+ access-violation


    【解决方案1】:

    在调用关闭 GDI+ 之后,您创建的 Bitmap 实例超出了范围。所以当Bitmap被破坏时,它不能调用给定的GdipDisposeImage方法。

    如果您确保在关闭 GDI+ 之前删除了 bitmap,则该错误应该会消失。

    【讨论】:

    • +1 这个。在位图周围添加一对括号以强制其超出范围,或使其成为指针类型(丑陋)。
    • 这是有道理的。但是如何显式销毁在堆栈上创建的位图?
    • @Mike:围绕 Bitmap 调用的块范围如此之大。这实际上解决了它。甜 :) 感谢您的快速回复
    • @Michael:是的。通过限制对象绑定的范围,您可以强制它们离开最深处;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多