2010-08-31 82 views
0

我目前正在做一些使用開羅的測試來代替一些現有的GDI/GDI + 在Visual C++ 2010中的代碼,它似乎工作正常,但我每次收到 錯誤消息關閉我的應用程序:退出時出現開羅錯誤信息

「第一次機會異常在0x68e629dc在CairoTest.exe:0000005: 訪問衝突讀取位置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); 
} 

可有人點我的,我做錯了什麼方向?

就像我說的,代碼似乎工作正常,但我不喜歡只是耕耘,無論何時我可以看到錯誤。

回答

1

第一次機會異常並不一定意味着太多 - 它們是Windows內存管理的常規組成部分。基本上,任何時候訪問虛擬內存中的內容(例如,在分頁文件上)都會創建第一個機會異常。操作系統通過將所需數據分頁到物理內存來處理它,然後您的代碼可以繼續執行。

如果/當你看到一個二次機會異常,這意味着操作系統沒有處理異常,所以除非你在代碼中有一個處理程序,否則很可能是一個真正的問題。

+0

謝謝,這解釋了很多。我認爲我需要做更多的挖掘工作來找出究竟發生了什麼。 我只是不想讓調試器產生錯誤信息 - 經驗告訴我,如果你忽略它們,他們有一種討厭的習慣,會回來咬你。 – Redeye 2010-08-31 21:06:05

+0

對,我已經做了更多的研究,並且在這裏發現了一篇非常好的文章: http://blogs.msdn.com/b/davidklinems/archive/2005/07/18/440150。 aspx 進一步的檢查確實證明它在Cairo DLL中導致異常。然而,我已經滿足了我對發生的事情的好奇心,所以我現在要離開它而不用擔心它。 謝謝你幫助傑瑞。 – Redeye 2010-09-01 10:53:05