Cist(BYTE *a, int width, int height)
{
    int wth,hgt; //扩展图像的宽和高
    wth = width + 2;
    hgt = height + 2; 

    long len=wth*hgt;    BYTE *b = new BYTE[len]; //!该行编译通过,执行时有时后报错    for( int i = 0; i < hgt; i++)  //拓展的边缘补0
        for ( int j =0; j < wth; j++ )
{
            if ( j%wth == 0 || (j+1)%wth == 0 ||
i == 0 || i == hgt-1 )
b[i*wth + j] = 0;
            else
b[i*wth + j] = a[(i-1)*width+(j-1)];
        } 
 }在函数内开辟空间报错,len=70000左右.  为什么会显示  0xc00000005 access Violation  错误!
这不是在堆上开辟的空间吗? 我在其他类的函数里面开辟更多的空间都没有问题.

解决方案 »

  1.   

    CWinThread* pWinThread = AfxGetThread();
    if ( pWinThread != NULL )
    {
    lResult = pWinThread->ProcessWndProcException(e, &pThreadState->m_lastSentMsg);
     TRACE1("Warning: Uncaught exception in WindowProc (returning %ld).\n",
    lResult);
    }按F11单步运行,进入了这里,在
    lResult = pWinThread->ProcessWndProcException(e, &pThreadState->m_lastSentMsg);
    出现错误.new 一块内存这么麻烦,急切请高手指点
      

  2.   

    width*height=多少?是不是大于70000了?
    另外不止b会越界,a也会。
    b[i*wth + j] = a[(i-1)*width+(j-1)]; 你要判断一下是哪个越界了。
      

  3.   

    调试即可看到,当出现内存错误时,具体参数的runtime值,估计是空间开小了。而且你这边只new没有delete。
      

  4.   

    已经大于70000了,是有什么要求不能大于70000吗?但是我其他函数内开辟的空间更大,有1280x960.就是在运行到这里 BYTE *b = new BYTE[len]; 会报错,有时候第一次可以,但第二次报错.
    下面的复制还没有执行.delete []b  代码加在函数结束前 .
      

  5.   

    报0xc00000005 access Violation 错误时查看上一级堆栈,
    或者在调试选项中Exceptions开启 Cxxxx5一项, 到时就停下来了,估计还是访问越界 
      

  6.   

    条件判断的代码,当i=0时如果进入else条件,这句
    b[i*wth + j] = a[(i-1)*width+(j-1)]; 中的 a[(i-1)*width+(j-1)] 数组下标会成为很大的负值
    访问越界
      

  7.   


    BYTE *b = new BYTE[len]; //!该行编译通过,执行时有时后报错
    很有可能是在此之前已经有内存错误发生的,通常是越界或者释放后还被访问过。但是没有立马表现出来。直到又有new的动作时才发现。
      

  8.   

    BYTE *b = new BYTE[len]; //没有delete 
      

  9.   

    感谢各位朋友,今天发现该贴还没有结贴,问题我已经发现了,saylerboxer说的对,我有段内存访问越界了,当时没有表现错误,但是已经把堆栈破坏了,下次再去开辟内存时就会报错。