用我仅剩的分数发出令我吐血的帖子,望高手可怜一下,指点迷津!拜托了

QQ_370566617 2006-08-30 08:07:23
不想看程序,看看我的注释和问题,请给点建议!!!
程序不是我写的,我读起来有点费劲,但是大概意思还是能看明白
我就是加了个参数改动了一下

BOOL SpinFilterDIB(HDIB hDIB,CArray4b* pArray4b/*=NULL*/)
{
ASSERT(hDIB!=NULL);

unsigned* peArray = NULL;
if(pArray4b) peArray = new unsigned;

// start wait cursor
WaitCursorBegin();

HDIB hDib = NULL;
HDIB hNewDib = NULL;
// we only convolute 24bpp DIB, so first convert DIB to 24bpp
WORD wBitCount = DIBBitCount(hDIB);
if (wBitCount != 24)
{
hNewDib = ConvertDIBFormat(hDIB, 24, NULL);
hDib = CopyHandle(hNewDib);
}
else
{
hNewDib = CopyHandle(hDIB);
hDib = CopyHandle(hDIB);
}

// process!
LPBYTE lpSrcDIB = (LPBYTE)GlobalLock(hDib);
LPBYTE lpDIB = (LPBYTE)GlobalLock(hNewDib);
LPBYTE lpInput = FindDIBBits(lpSrcDIB);
LPBYTE lpOutput = FindDIBBits(lpDIB);
int nWidth = DIBWidth(lpSrcDIB);
int nHeight = DIBHeight(lpSrcDIB);

BYTE *lpPoints=new BYTE[nWidth*nHeight];
ASSERT(lpPoints!=NULL);
//将图象数据取出为矩阵
GetPoints(nWidth,nHeight,lpInput,lpPoints,MEAN_TYPE);

int i,j;

//
//算法实现部分,就是处理矩阵lpPoints
//

delete peArray;

//将数据矩阵放到图象中
PutPoints(nWidth,nHeight,lpOutput,lpPoints);
delete lpPoints;
lpPoints = NULL;

// recover
DWORD dwSize = GlobalSize(hDib);
memcpy(lpSrcDIB, lpDIB, dwSize);
GlobalUnlock(hDib);
GlobalUnlock(hNewDib);
if (wBitCount != 24)
{
//?我很奇怪这,hNewDib指向还是有空间的,在没有释放的情况下赋值,旧的空间怎么办?是不是我看错了?
//是不是应该先释放?
hNewDib = ConvertDIBFormat(hDib, wBitCount, NULL);

lpSrcDIB = (LPBYTE)GlobalLock(hDIB);
lpDIB = (LPBYTE)GlobalLock(hNewDib);
dwSize = GlobalSize(hNewDib);
memcpy(lpSrcDIB, lpDIB, dwSize);
GlobalUnlock(hDIB);
GlobalUnlock(hNewDib);
}
else
{
lpSrcDIB = (LPBYTE)GlobalLock(hDIB);
lpDIB = (LPBYTE)GlobalLock(hDib);
dwSize = GlobalSize(hDib);
memcpy(lpSrcDIB, lpDIB, dwSize);
GlobalUnlock(hDIB);
GlobalUnlock(hDib);
}

// cleanup
GlobalFree(hDib);
GlobalFree(hNewDib);

// return
WaitCursorEnd();
return TRUE;
}

我是这么使用它的
BOOL CDibPro::SpinFilter(CArray4b* pArray4b /*=NULL*/)
{
if (IsEmpty())
return FALSE;

//####m_hDib是类内的图象句柄,delete其实主要是释放它
if (!SpinFilterDIB(m_hDib,pArray4b))
return FALSE;

//return
return UpdateInternal();
}

我就很郁闷了,调用这个成员函数之前还可以delete对象(我用断点试了),调用之后就delete就出错!!!!!!!!!!!!!!!
我不知道这个函数那出问题了,郁闷,真是看不出来才问的?


...全文
256 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
snowbirdfly 2006-08-31
  • 打赏
  • 举报
回复
GlobalFree(hDib);
那你判断hDib是否为空
if(!hDib)
GlobalFree(hDib);
QQ_370566617 2006-08-31
  • 打赏
  • 举报
回复
现在问题定位在


void DestroyDIB(HDIB hDib)
{
GlobalFree(hDib);
}

凡是释放那块句柄的就出错,弹出个对话框

但是,那块句柄非空,而且可以使用,所以我很纳闷

另外就是,那块句柄是图象句柄,是程序显示的一块图象的句柄,应该和这个没问题

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧