【新手】visual c++ 6.0 中 delete 错误!怎么分析?

sxshao 2005-03-18 11:19:44
【新手】visual c++ 6.0 中 delete 错误!怎么分析?

nXProject=new int[nXStep];

for (ni=0; ni<nXCount; ni++)
{
memset(nXProject, 0, nXStep * sizeof(int));
nXPrjSum=0;
GetProject(ni*nXStep);

.......................

}
}

delete nXProject; //【error!】


dbgheap.c ----->


if (!CheckBytes(pbData(pHead) + pHead->nDataSize, _bNoMansLandFill, nNoMansLandSize))
_RPT3(_CRT_ERROR, "DAMAGE: after %hs block (#%d) at 0x%08X.\n",
szBlockUseName[_BLOCK_TYPE(pHead->nBlockUse)],
pHead->lRequest,
(BYTE *) pbData(pHead)); [<------------停到这里了?]
...全文
175 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
chaochao1980 2005-03-18
  • 打赏
  • 举报
回复
可以把你的函数整体考上来看一下吗?
jerry 2005-03-18
  • 打赏
  • 举报
回复
GetProject(ni*nXStep);
这个可能有问题,可能访问数组越界了.
另,delete要对应,这个上面的都提到了
用memset来初始化简单变量的数组是可以的,没什么问题.
whs1980 2005-03-18
  • 打赏
  • 举报
回复
memset(nXProject, 0, nXStep * sizeof(int));来初始化整形变量好像不太好吧.
删除的时候要用:
delete[] nXProject;
sxshao 2005-03-18
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/TopicView.asp?id=3742413

我要结贴了,谁要分?
sxshao 2005-03-18
  • 打赏
  • 举报
回复
to wuchi(风云)

局部变量

少拷了前一句:

int* nXProject=NULL;
wuchi 2005-03-18
  • 打赏
  • 举报
回复
nXProject是个全局变量吧,你放另外一个函数里试试看
sxshao 2005-03-18
  • 打赏
  • 举报
回复
错误还在。一样的。
chaochao1980 2005-03-18
  • 打赏
  • 举报
回复
new[]和delete[]对应,new和delete对应。

nXProject=new int[nXStep];
释放nXProject内存,应该使用delete[] nXProject;
whs1980 2005-03-18
  • 打赏
  • 举报
回复
nXProject[x-nX1]++;
nYProject[y-nY1]++;
调试一下啊,看看是不是这里自加一以后就越界了
sxshao 2005-03-18
  • 打赏
  • 举报
回复
注释了

nXProject[x-nX1]++;
nYProject[y-nY1]++;

就行了。

这句话怎么错了?

好像没越界啊?
sxshao 2005-03-18
  • 打赏
  • 举报
回复
难道是 GetProject 错了?

int CAreaPro::GetProject( int nX1, int nY1, int nX2, int nY2,
int* nXProject, int* nYProject, int& nXPrjSum, int& nYPrjSum)
{
//无CDibObject对象, 返回FALSE
if( m_pDibObject == NULL ) return( FALSE );

//坐标规整化
m_pDibObject->NormalizeCoordinates( &nX1, &nY1, &nX2, &nY2 );

//定义变量
unsigned char *pBuffer, *pData;
RGBQUAD *pPalette;
int nWidthBytes, nNumColors;

//获得图像指针
pBuffer = (unsigned char *) m_pDibObject->GetDIBPointer( &nWidthBytes,
m_pDibObject->GetNumBits() );
if( pBuffer == NULL ) return( NULL );

//获得颜色数
nNumColors = m_pDibObject->GetNumColors();
//获得调色板指针
pPalette = (RGBQUAD *) &pBuffer[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)];
//获得位图数据指针
pData = (unsigned char *) &pBuffer[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ nNumColors * sizeof(RGBQUAD)];


//变量定义
DWORD dwGray;
int x, y;
unsigned char *pTemp, ucRed, ucGreen, ucBlue;

//图像的高度
int nHeight = m_pDibObject->GetHeight();

switch(m_pDibObject->GetNumBits())
{
case 1: //每像素位数为1,不处理
break;
case 4: //每像素位数为4,不处理
break;
case 8: //每像素位数为8
for( y = nY1; y <= nY2; y++ )
{
//数据指针定位到图像数据起始位置
pTemp = pData;
//数据指针定位到图像数据每行的起始零位置
pTemp += ((nHeight - 1 - y) * nWidthBytes);
//数据指针定位到图像数据每行的起始nX1位置
//pTemp += nX1;
for(x = nX1; x <= nX2; x++)
{
//pTemp[x]为当前像素值,以此为调色板项的索引值,
//取出调色板项的相应红绿蓝分量值。
ucRed = pPalette[pTemp[x]].rgbRed;
ucGreen = pPalette[pTemp[x]].rgbGreen;
ucBlue = pPalette[pTemp[x]].rgbBlue;

//按关系L=0.3R+0.59G+0.11B,得到亮度值
dwGray = ((DWORD) ucRed * 30 +
(DWORD) ucGreen * 59 +
(DWORD) ucBlue * 11) / 100;
dwGray &= 0x000000ff;

if (dwGray==255)
{
nXProject[x-nX1]++;
nYProject[y-nY1]++;

}
}
}
break;
case 16: //每像素位数为16
for(y = nY1; y <= nY2; y++)
{
//数据指针定位到图像数据起始位置
pTemp = pData;
//数据指针定位到图像数据每行的起始零位置
pTemp += (( nHeight - 1 - y) * nWidthBytes);
//数据指针定位到图像数据每行的起始nX1位置
pTemp += (nX1 * 2);
for(x = nX1; x <= nX2; x++)
{
//调用GETRGB555宏获取三原色分量
GETRGB555(ucRed, ucGreen, ucBlue, pTemp);

//按关系L=0.3R+0.59G+0.11B,得到亮度值
dwGray = ((DWORD) ucRed * 30 +
(DWORD) ucGreen * 59 +
(DWORD) ucBlue * 11) / 100;
dwGray &= 0x000000ff;

if (dwGray==255)
{
nXProject[x-nX1]++;
nYProject[y-nY1]++;

}

//数据指针加2
pTemp += 2;
}
}
break;
case 24: //每像素位数为24
for(y = nY1; y < nY2; y++)
{
//数据指针定位到图像数据起始位置
pTemp = pData;
//数据指针定位到图像数据每行的起始零位置
pTemp += (( nHeight - 1 - y) * nWidthBytes);
//数据指针定位到图像数据每行的起始nX1位置
//pTemp += (nX1 * 3);

for(x=nX1; x<=nX2; x++)
{
//获取像素颜色的三原色。
ucRed = pTemp[x * 3 + 2];
ucGreen = pTemp[x * 3 + 1];
ucBlue = pTemp[x * 3];

//按关系L=0.3R+0.59G+0.11B,得到亮度值
dwGray = ((DWORD) ucRed * 30 +
(DWORD) ucGreen * 59 +
(DWORD) ucBlue * 11) / 100;
dwGray &= 0x000000ff;

if (dwGray==255)
{
//CString str;
//str.Format("(%d-%d,%d-%d)=(%d,%d)",x,nX1,y,nY1,nXProject[x-nX1], nYProject[y-nY1]);
//AfxMessageBox((LPCTSTR)str, MB_OK,0 );

nXProject[x-nX1]++;
nYProject[y-nY1]++;

}
}
}
break;
case 32: //每像素位数为24
for(y = nY1; y <= nY2; y++)
{
//数据指针定位到图像数据起始位置
pTemp = pData;
//数据指针定位到图像数据每行的起始零位置
pTemp += (( nHeight - 1 - y) * nWidthBytes);
//数据指针定位到图像数据每行的起始nX1位置
pTemp += (nX1 * 4);

for(x = nX1; x <= nX2; x++)
{
//调用GETRGB888宏获取像素颜色的三原色。
GETRGB888(ucRed, ucGreen, ucBlue, pTemp);

//按关系L=0.3R+0.59G+0.11B,得到亮度值
dwGray = ((DWORD) ucRed * 30 +
(DWORD) ucGreen * 59 +
(DWORD) ucBlue * 11) / 100;

dwGray &= 0x000000ff;

if (dwGray==255)
{
nXProject[x-nX1]++;
nYProject[y-nY1]++;

}

//数据指针加4
pTemp += 4;
}
}
break;
}

for(x = nX1; x <= nX2; x++)
if (nXProject[x-nX1]>0) nXPrjSum++;

for(y = nY1; y <= nY2; y++)
if (nYProject[y-nY1]>0) nYPrjSum++;

::GlobalUnlock(m_pDibObject->GetDib());

return(TRUE);

}

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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