0

我目前正在使用 Cairo 进行一些测试,以替换 Visual C++ 2010 中的一些现有 GDI/GDI+ 代码,它似乎工作正常,但每次关闭我的应用程序时都会收到一条错误消息:

“CairoTest.exe 中 0x68e629dc 的第一次机会异常:0xC0000005:访问冲突读取位置 0xabababa7”

仅当我在应用程序运行时调用 cairo_paint(cr) 时才会发生此错误 - 如果我将此行注释掉,它就会消失。到目前为止,我的应用程序中唯一的开罗代码是:

CChildView::CChildView()
{
     testsurface = cairo_image_surface_create_from_png("BlackShinyBackground.png");
}

CChildView::~CChildView()
{
     cairo_surface_destroy(testsurface);
}

void CChildView::OnPaint()
{
     CPaintDC dc(this);

     cairo_surface_t *surface = cairo_win32_surface_create(dc.m_hDC);
     cairo_t *cr = cairo_create (surface);

     cairo_set_source_surface(cr, testsurface, 0, 0);
     cairo_paint(cr);
     cairo_destroy (cr);
     cairo_surface_destroy (surface);
}

谁能指出我做错了什么的方向?

就像我说的那样,代码似乎工作正常,但我不喜欢不管什么时候看到错误都继续努力。

4

1 回答 1

1

第一次机会异常并不一定意味着什么——它们是 Windows 内存管理的常规部分。基本上,每当您访问虚拟内存中的内容(例如,在页面文件上)时,都会创建第一次机会异常。操作系统通过将所需数据分页到物理内存来处理它,然后您的代码可以继续执行。

如果/当你看到第二次机会异常时,这意味着操作系统没有处理异常,所以除非你的代码中有一个处理程序,否则很有可能这是一个真正的问题。

于 2010-08-31T16:17:33.223 回答