程序中有这么一个子函数:
espl2(...)

...
    double *s;
    s=new double[n];
....
delete[] s;
}
程序中要循环调用,在循环到其中一步的时候就在delete[] s;处发生内存错误:DAMAGE After Normal block ...编译器提示在此行内存泄漏,同时别的很多new的地方也提示内存泄漏。减少循环次数就全不泄漏了。本文vc处于菜鸟水平,恳求各位帮忙啊!

解决方案 »

  1.   

    你的循环里面有没有return或者continue
      

  2.   

    new和delete的调用次数要保证相等.new次数大于delete次数会造成内存无法释放.如果delete次数比new的次数多就是你说的现象:到某一次delete的时候程序崩掉了.建议不是不得已,不要将new和delete分别写到一个循环体的外面和里面,很容易出错的
      

  3.   

    你函数中应该有什么地方没delete就返回了
      

  4.   

    感谢各位的关注,此函数的代码是这样的,但是调用的代码就没法贴出来了,整个代码乱七八糟几万行,是不是跟别的地方的new和delete有关系?如何确定?
    万分感谢各位,等问题解决我再把我所有的分分给大家!
    double Clunguijiechu::espl2(double *x,double *y,int n,double *dy,double *ddy,\
    double *t,int m,double *z,double *dz,double *ddz)

    int i,j;
        double h0,h1,alpha,beta,g,*s;
        s=new double[n];
        dy[0]=-0.5;
        h0=x[1]-x[0];
        s[0]=3.0*(y[1]-y[0])/(2.0*h0)-ddy[0]*h0/4.0;
        for (j=1;j<=n-2;j++)
          { h1=x[j+1]-x[j];
            alpha=h0/(h0+h1);
            beta=(1.0-alpha)*(y[j]-y[j-1])/h0;
            beta=3.0*(beta+alpha*(y[j+1]-y[j])/h1);
            dy[j]=-alpha/(2.0+(1.0-alpha)*dy[j-1]);
            s[j]=(beta-(1.0-alpha)*s[j-1]);
            s[j]=s[j]/(2.0+(1.0-alpha)*dy[j-1]);
            h0=h1;
          }
        dy[n-1]=(3.0*(y[n-1]-y[n-2])/h1+ddy[n-1]*h1/
                2.0-s[n-2])/(2.0+dy[n-2]);
        for (j=n-2;j>=0;j--)
          dy[j]=dy[j]*dy[j+1]+s[j];
        for (j=0;j<=n-2;j++) s[j]=x[j+1]-x[j];
        for (j=0;j<=n-2;j++)
          { h1=s[j]*s[j];
            ddy[j]=6.0*(y[j+1]-y[j])/h1-2.0*(2.0*dy[j]+dy[j+1])/s[j];
          }
        h1=s[n-2]*s[n-2];
        ddy[n-1]=6.*(y[n-2]-y[n-1])/h1+2.*(2.*dy[n-1]+dy[n-2])/s[n-2];
        g=0.0;
        for (i=0;i<=n-2;i++)
          { h1=0.5*s[i]*(y[i]+y[i+1]);
            h1=h1-s[i]*s[i]*s[i]*(ddy[i]+ddy[i+1])/24.0;
            g=g+h1;
          }
        for (j=0;j<=m-1;j++)
          { if (t[j]>=x[n-1]) i=n-2;
            else
              { i=0;
                while (t[j]>x[i+1]) i=i+1;
              }
            h1=(x[i+1]-t[j])/s[i];
            h0=h1*h1;
            z[j]=(3.0*h0-2.0*h0*h1)*y[i];
            z[j]=z[j]+s[i]*(h0-h0*h1)*dy[i];
            dz[j]=6.0*(h0-h1)*y[i]/s[i];
            dz[j]=dz[j]+(3.0*h0-2.0*h1)*dy[i];
            ddz[j]=(6.0-12.0*h1)*y[i]/(s[i]*s[i]);
            ddz[j]=ddz[j]+(2.0-6.0*h1)*dy[i]/s[i];
            h1=(t[j]-x[i])/s[i];
            h0=h1*h1;
            z[j]=z[j]+(3.0*h0-2.0*h0*h1)*y[i+1];
            z[j]=z[j]-s[i]*(h0-h0*h1)*dy[i+1];
            dz[j]=dz[j]-6.0*(h0-h1)*y[i+1]/s[i];
            dz[j]=dz[j]+(3.0*h0-2.0*h1)*dy[i+1];
            ddz[j]=ddz[j]+(6.0-12.0*h1)*y[i+1]/(s[i]*s[i]);
            ddz[j]=ddz[j]-(2.0-6.0*h1)*dy[i+1]/s[i];
          }
    delete[] s;
        
    return(g);
    }
      

  5.   

    for (j=0;j<=m-1;j++)m-1 一定小于n么?
    如果不能保证,z[j]=(3.0*h0-2.0*h0*h1)*y[i];
            z[j]=z[j]+s[i]*(h0-h0*h1)*dy[i];这两句不是有危险??
      

  6.   

    我再核对下算法
    但发现个问题,注释掉delete[] s;行后,程序就能算完了,但是后面几步计算出来的结果是1#QUAN了。
      

  7.   

    数组越界导致s的值被破坏,delete一个不是new得到的地址会导致异常。