c++ - 异常:循环中内存位置的 std::bad_alloc

标签 c++ exception memory-leaks memory-management

我有一个内存分配问题。但是不知道问题出在哪里

在第 55 次迭代运行下面的循环时出现错误。在此之下,代码给出了我想要的。

错误发生的代码段(整个代码太长):

  while(k<75){  

      domainz1.getVerticalBoundaryBegin(xz1,e1,row);
      domainz2.getVerticalBoundaryBegin(xz2,e2,row);
      domainz3.getVerticalBoundaryBegin(xz3,e3,row);
      domainz4.getVerticalBoundaryBegin(xz4,e4,row);
      domainz5.getVerticalBoundaryBegin(xz5,e5,row);
      domainz6.getVerticalBoundaryBegin(xz6,e6,row);


      domaine1.drichletFunctionalUpdateVertical(Ae1,be1,e1,ydimDom);
      domaine2.drichletFunctionalUpdateVertical(Ae2,be2,e1,1);
      domaine2.drichletFunctionalUpdateVertical(Ae2,be2,e2,ydimDom);
      domaine3.drichletFunctionalUpdateVertical(Ae3,be3,e2,1);
      domaine3.drichletFunctionalUpdateVertical(Ae3,be3,e3,ydimDom);
      domaine4.drichletFunctionalUpdateVertical(Ae4,be4,e3,1);
      domaine4.drichletFunctionalUpdateVertical(Ae4,be4,e4,ydimDom);
      domaine5.drichletFunctionalUpdateVertical(Ae5,be5,e4,1);
      domaine5.drichletFunctionalUpdateVertical(Ae5,be5,e5,ydimDom);
      domaine6.drichletFunctionalUpdateVertical(Ae6,be6,e5,1);
      domaine6.drichletFunctionalUpdateVertical(Ae6,be6,e6,ydimDom);
      domaine7.drichletFunctionalUpdateVertical(Ae7,be7,e6,1);

      gmressolver2d(Ae1,xe1,be1,KrylovDim,xdim,ydimDom,COP,twoDimStencil,0,1);
      gmressolver2d(Ae2,xe2,be2,KrylovDim,xdim,ydimDom,COP,twoDimStencil,0,1);
      gmressolver2d(Ae3,xe3,be3,KrylovDim,xdim,ydimDom,COP,twoDimStencil,0,1);
      gmressolver2d(Ae4,xe4,be4,KrylovDim,xdim,ydimDom,COP,twoDimStencil,0,1);
      gmressolver2d(Ae5,xe5,be5,KrylovDim,xdim,ydimDom,COP,twoDimStencil,0,1);
      gmressolver2d(Ae6,xe6,be6,KrylovDim,xdim,ydimDom,COP,twoDimStencil,0,1);
      gmressolver2d(Ae7,xe7,be7,KrylovDim,xdim,ydimDom,COP,twoDimStencil,0,1);

      //*******************************************************************
      domaine1.getVerticalBoundaryBegin(xe1,z1,row);
      domaine2.getVerticalBoundaryBegin(xe2,z2,row);
      domaine3.getVerticalBoundaryBegin(xe3,z3,row);
      domaine4.getVerticalBoundaryBegin(xe4,z4,row);
      domaine5.getVerticalBoundaryBegin(xe5,z5,row);
      domaine6.getVerticalBoundaryBegin(xe6,z6,row);
      domaine7.getVerticalBoundaryBegin(xe7,z7,row);


      domainz1.drichletFunctionalUpdateVertical(Az1,bz1,z1,1);
      domainz1.drichletFunctionalUpdateVertical(Az1,bz1,z2,ydimDom);
      domainz2.drichletFunctionalUpdateVertical(Az2,bz2,z2,1);
      domainz2.drichletFunctionalUpdateVertical(Az2,bz2,z3,ydimDom);
      domainz3.drichletFunctionalUpdateVertical(Az3,bz3,z3,1);
      domainz3.drichletFunctionalUpdateVertical(Az3,bz3,z4,ydimDom);
      domainz4.drichletFunctionalUpdateVertical(Az4,bz4,z4,1);
      domainz4.drichletFunctionalUpdateVertical(Az4,bz4,z5,ydimDom);
      domainz5.drichletFunctionalUpdateVertical(Az5,bz5,z5,1);
      domainz5.drichletFunctionalUpdateVertical(Az5,bz5,z6,ydimDom);
      domainz6.drichletFunctionalUpdateVertical(Az6,bz6,z6,1);
      domainz6.drichletFunctionalUpdateVertical(Az6,bz6,z7,ydimDom);

      gmressolver2d(Az1,xz1,bz1,KrylovDim,xdim,ydimDom,COP,twoDimStencil,0,1);
      gmressolver2d(Az2,xz2,bz2,KrylovDim,xdim,ydimDom,COP,twoDimStencil,0,1);
      gmressolver2d(Az3,xz3,bz3,KrylovDim,xdim,ydimDom,COP,twoDimStencil,0,1);
      gmressolver2d(Az4,xz4,bz4,KrylovDim,xdim,ydimDom,COP,twoDimStencil,0,1);
      gmressolver2d(Az5,xz5,bz5,KrylovDim,xdim,ydimDom,COP,twoDimStencil,0,1);
      gmressolver2d(Az6,xz6,bz6,KrylovDim,xdim,ydimDom,COP,twoDimStencil,0,1);


      k++;

      printf("%d iterations done\n",k);
  }

这里几乎所有括号内的术语都是数组。

Ae1,Ae2,Az1,Az2,..... 是二维数组 71x11

xe1,xz1,bz1,be1,e1,e2,z1,z2,......... 是大小为 (71x11) 的一维数组。

这些类运算符基本上是在这些数组之间传递数据。这是一个科学代码,gmressolver2d 在每次迭代中解决新问题。

关键是我的内存分配总是增加和增加,我不知道该怎么做才能防止这种情况发生。

最好的问候, 埃姆雷。

编辑:我的数组分配。

template <typename T> 
T ****AllocateDynamic4DArray( int nRows, int nCols, int nSlice, int kSlice)
{
      T ****dynamicArray;

      dynamicArray = new T***[nRows];
      for( int i = 0 ; i < nRows ; i++ ){
        dynamicArray[i] = new T**[nCols];
        for ( int j=0; j<nCols;j++){
            dynamicArray[i][j] = new T*[nSlice];
            for (int k=0; k<nSlice; k++){
                dynamicArray[i][j][k] = new T[kSlice];
                for(int l=0;l<kSlice;l++){
                    dynamicArray[i][j][k][l] = 0;
                }
            }
        }
      }
      return dynamicArray;
}
template <typename T>
T ***AllocateDynamic3DArray(int nRows, int nCols, int nSlice){
      T ***dynamicArray;

      dynamicArray = new T**[nRows];
      for( int i = 0 ; i < nRows ; i++ ){
        dynamicArray[i] = new T*[nCols];
        for ( int j=0; j<nCols;j++){
            dynamicArray[i][j] = new T[nSlice];
            for (int k=0; k<nSlice; k++){
                    dynamicArray[i][j][k]= 0;
                }
            }
        }
      return dynamicArray;
}
template <typename T>
T **AllocateDynamic2DArray(int nRows, int nCols){
      T **dynamicArray;

      dynamicArray = new T*[nRows];
      for( int i = 0 ; i < nRows ; i++ ){
        dynamicArray[i] = new T[nCols];
        for ( int j=0; j<nCols;j++){
                dynamicArray[i][j]= 0;
            }
        }
      return dynamicArray;
}
template <typename T>
T *AllocateDynamicVector(int nRows){
      T *dynamicArray;

      dynamicArray = new T[nRows];
      for( int i = 0 ; i < nRows ; i++ ){
            dynamicArray[i]= 0;
        }
      return dynamicArray;
}

最佳答案

在调试器中运行程序,并设置调试器,使其在抛出异常时中断。一旦程序停止(由于异常),使用调试器的调用堆栈功能来查看在哪个上下文中抛出异常。

我想给你更详细的说明,但你没有指定你使用的平台/编译器。


how-to描述了如何设置 Visual Studio 以中断任何异常。

how-to描述了如何使用调用堆栈。

关于c++ - 异常:循环中内存位置的 std::bad_alloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5822764/

相关文章:

java - 错误页面返回状态代码 200 默认响应

c++ - 可以安全地假设 float 或 double NaN 作为字符串始终为 "nan"吗?

c++ - 在 C++ 中的非默认参数之间创建具有默认参数的函数

android - 在捕获异常时在 Android 中显示自定义 AlertDialog

Python:异常装饰器。如何保留堆栈跟踪

Golang goroutine无限循环内存泄漏

c++ - 使用 mapviewofffile 随机读取文件

python - Boost.Python TypeError : __init__() should return None not 'NoneType' - but no obvious linker or version problem

安卓 : How to test memory leak in an application?

ruby - 从 Rails 3.0 升级到 Rails 3.2(Ruby 1.9.3 + Passenger)后出现巨大的内存泄漏/膨胀