读取位置 0x00000000 时发生访问冲突

lippl 2012-08-04 03:45:21
大家好,我的这段代码总是会有读取位置 0x00000000 时发生访问冲突,请帮助查查~非常感谢
代码如下

UCHAR* pBufOut = new UCHAR[width];
UCHAR* pBufWin = NULL;
UCHAR** pBufBands = NULL;
UCHAR** pBufWin2D = NULL;
UCHAR*** pBufBands3D = NULL;
for (int j=0; j<height;j++)
{
for (int i=0; i<width;i++)
{
nWinSize = nWinSizeDefault;
do
{
//此处可能会有新的nWinSize的值,且根据i,j的不同而不同
//if(nWinSizeOk)break;
} while (1);

HalfWindow = nWinSize/2;

pBufBands = new UCHAR*[nBand];
for (int n=0;n<nBand;n++)
{
pBufBands[n] = new UCHAR[nWinSize*nWinSize];
}

for (int n=0;n<nBand;n++)
{
CGEO_RasterData* pRaster = m_pImage_->GetRasterData(n);
//对pBufBands[n]赋值
Get_Mask_Buf(pRaster,rect.left+i,rect.top+j,nWinSize,pBufBands[n]);
}

//根据nWinSize 和 nBand 建立 一个二维数组和三维数组
pBufWin2D = new UCHAR*[nWinSize];
for (int n1=0;n1<nWinSize;n1++)
{
pBufWin2D[n1]=new UCHAR[nWinSize];
//memset(pBufWin2D[n1],0,nWinSize*sizeof(UCHAR));
}

pBufBands3D= new UCHAR**[nWinSize];
for (int n1=0;n1<nWinSize;n1++)
{
pBufBands3D[n1]=new UCHAR*[nWinSize];
for (int n2=0;n2<nWinSize;n2++)
{
pBufBands3D[n1][n2]=new UCHAR[nBand];
}
}
//由pBufBands和pBufWin 给pBufBands3D和pBufWin2D 赋值
for (int ii=0; ii<nWinSize; ii++)
{
for (int jj=0; jj<nWinSize; jj++)
{
int ID = pBufWin[ii*nWinSize+jj];
pBufWin2D[ii][jj] = ID;
for (int b =0;b<nBand;b++)
{
int val = pBufBands[b][ii*width + jj];
pBufBands3D[ii][jj][b] = val;
}
}
}

//将pBufBands3D和pBufWin2D输入函数计算
pBufOut[i] = adjust_mindist_classifier(nWinSize,pBufBands3D,pBufWin2D,dSpaWeight);

//释放内存
//free pBufWin and pBufBands
delete[] pBufWin;
pBufWin =NULL;
for (int n=0; n<nBand; n++)
{
delete []pBufBands[n];
}
delete []pBufBands;
pBufBands =NULL;

//free pBufWin2D and pBufBands3D
for (int n=0; n<nWinSize; n++){
delete []pBufWin2D[n];
}
delete []pBufWin2D;

for(int i = 0; i < nWinSize; ++i){
for(int j = 0; j < nWinSize; ++j)
delete [] (pBufBands3D[i][j]);
delete []pBufBands3D[i];
}
delete [] pBufBands3D;

pBufWin2D =NULL;
pBufBands3D =NULL;
}
}



该段代码在debug下可以不定地运行数次循环,但在循环中会有
有未经处理的异常: 0x00000000:

其最后调用堆栈位置在:
pBufBands3D[n1][n2]=new UCHAR[nBand]; 这个函数处
...全文
680 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
localxiao 2012-08-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

一般来说,new之后判断是否成功,使用前判断指针是否为NULL,释放后将指针置为NULL任何时间都不会出错,当然是单线程,如果是多线程就要加锁。
[/Quote]

new失败是抛出std::bad_alloc异常。不会返回NULL
IVERS0N 2012-08-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

应该是

C/C++ code

//由pBufBands和pBufWin 给pBufBands3D和pBufWin2D 赋值
for (int ii=0; ii<nWinSize; ii++)
{
for (int jj=0; jj<nWinSize; jj++)
{
int ID = pBufW……
[/Quote]

单步调试下 应该是越界了
lippl 2012-08-04
  • 打赏
  • 举报
回复
应该是


//由pBufBands和pBufWin 给pBufBands3D和pBufWin2D 赋值
for (int ii=0; ii<nWinSize; ii++)
{
for (int jj=0; jj<nWinSize; jj++)
{
int ID = pBufWin[ii*nWinSize+jj];
pBufWin2D[ii][jj] = ID;
for (int b =0;b<nBand;b++)
{
int val = pBufBands[b][ii*width + jj];
pBufBands3D[ii][jj][b] = val;
}
}
}


这段有些问题,注释后就运行正常了!
lippl 2012-08-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

一般来说,new之后判断是否成功,使用前判断指针是否为NULL,释放后将指针置为NULL任何时间都不会出错,当然是单线程,如果是多线程就要加锁。
[/Quote]

谢谢,我再去试试,加锁的代码怎么写呢?
PS:挺喜欢你的头像的~~@@
lippl 2012-08-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

轮流在每一个new之后就delete测试下会不会出错
[/Quote]

这样不会有问题,能够运行完的!
一叶之舟 2012-08-04
  • 打赏
  • 举报
回复
一般来说,new之后判断是否成功,使用前判断指针是否为NULL,释放后将指针置为NULL任何时间都不会出错,当然是单线程,如果是多线程就要加锁。
一叶之舟 2012-08-04
  • 打赏
  • 举报
回复
可能是new的时候失败了,new之后判断一下
pBufBands = new UCHAR*[nBand];
if(pBufBands==0)
return
lippl 2012-08-04
  • 打赏
  • 举报
回复
我试试呢~
IVERS0N 2012-08-04
  • 打赏
  • 举报
回复
轮流在每一个new之后就delete测试下会不会出错

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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