CImage析构函数问题?

时间:2014-05-11 04:39:04

标签: c++ mfc

我正在使用以下功能实时处理图像。使用计时器每10秒调用一次该函数。

问题在于我得到断言失败,并且无法找出确切的问题。我为ImageDC尝试了CImage :: ReleaseDC()和DeleteDC(),但没有运气。

有什么想法吗?

LRESULT CAutodetectDialog::AutoscanPatterns(WPARAM, LPARAM)
{
    HWND hwnd = ::FindWindow(NULL, windowTitle);

    if (hwnd != NULL)    
        for (int i=0; i<N_NUMBERS; i++)
        {        
            CImage image;
            image.Create(dbParams.width, dbParams.height, 24);

            CImageDC imageDC(image);
            ::SetWindowOrgEx(imageDC, db.topLeft.x, dbParams.topLeft.y + i * dbParams.height, NULL);
            ::PrintWindow(hwnd, imageDC, PW_CLIENTONLY);

            // Process the image - processing takes < 1 sec
            // and the image parameter is not being changed
            SaveImagePatterns(&image);                
        }            //   <-------------  This line fails , must be the destructor 
                     // of CImage : atlimage.h Line 884,  m_hDC == 0
                     // m_hDC is not NULL in the code

        return 0;
}


// Process the image - processing takes < 1 sec
// and the image parameter is not changed
void CAutodetectDialog::SaveImagePatterns(const CImage* image)
{
.........
}

这是在atlimage.h中失败的代码:

inline HBITMAP CImage::Detach() throw()
{
    HBITMAP hBitmap;

    ATLASSUME( m_hBitmap != NULL );
    ATLASSUME( m_hDC == NULL );             // <------ This guy

    hBitmap = m_hBitmap;
...


...
return( hBitmap );
}

更新:在注释掉对函数SaveImagePatterns()的调用之后,断言失败没有发生。所以问题必须在那个函数中,尽管CImage参数传递为 const

2 个答案:

答案 0 :(得分:1)

这看起来很可疑:

SaveImagePatterns(&image);

由于image是一个局部变量,取决于SaveImagePatterns对它的作用,这可能会导致问题,因为一旦退出该块,image对象就会被销毁。

答案 1 :(得分:0)

您是否已在xCode:6.4 ios Objective c with XIB 中自行致电image->GetDC()

请注意SaveImagePatterns需要与image->GetDC()配对。

因此image->ReleaseDC()将为m_hDC