我有一个内存分配问题。但我不知道问题出在哪里
在第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 donen",k);
}
括号中几乎所有的项都是数组。
Ae1、Ae2 Az1, Az2,……为二维数组71x11
xe1, xz1、bz1 be1, e1, e2 z1, z2 ,.........为尺寸为(71x11)的1D数组。
这些类操作符基本上在这些数组之间传输数据。这是一个科学的代码,gmressolver2d在每次迭代中解决新的问题。
关键是我的内存分配总是不断增加,我不知道该怎么做来防止这种情况。
最诚挚的问候,埃姆雷.
编辑:my array allocation .
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;
}
在调试器中运行程序,并设置调试器,使其在抛出异常时中断。一旦程序停止(因为异常),使用调试器的调用堆栈特性来查看异常是在哪个上下文中抛出的。
我想给你更详细的说明,但你没有指定你使用什么平台/编译器。
这个操作指南描述了如何设置Visual Studio以在任何异常时中断。
这个操作指南描述了如何使用调用堆栈。
使用UMDH.EXE在连续循环之前获取应用程序堆使用情况的快照,然后比较两个快照。如果设置得当,可以看到中间所有分配的调用栈。
当以分配数组的方式删除数组时,对delete [] array_name
的单个调用将不起作用,因为数组的一个维度中的每个索引都是新分配的指针"子数组"。所以你需要循环遍历每一行/列/切片等等。并在组成数组索引的指针数组上调用delete []
。例如,要释放一个3d数组,您需要执行如下操作:
for (int i=0; i < column_size; i++)
{
for (int j=0; j < slice_size; j++)
{
delete [] array_name[i][j];
}
delete [] array_name[i];
}
delete [] array_name;