CImage析构函数问题?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CImage析构函数问题?相关的知识,希望对你有一定的参考价值。
我正在使用下面的功能来实时处理图像。使用计时器每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传递。
答案
这看起来很可疑:
SaveImagePatterns(&image);
由于image
是一个局部变量,取决于SaveImagePatterns
对它的作用,这可能会导致问题,因为一旦该块退出,image
对象就会被销毁。
另一答案
你在image->GetDC()
自己打电话给任何SaveImagePatterns
吗?
请注意image->GetDC()
需要与image->ReleaseDC()
配对。
所以m_hDC
将是NULL
。
以上是关于CImage析构函数问题?的主要内容,如果未能解决你的问题,请参考以下文章
c++利用StretchBlt函数改变CImage输出图片的位置