2012-04-09 51 views
2

有人可以告诉我什么是for循环?当我运行它时,它会中断。我试图调试,看看有什么是错的,我注意到,在for循环,它只是停止:在C++中删除2d数组

#define MAX_POPULATION 64 
float **tr_pop;//Tournament candidates 
float **matingPool;//Mating pool 
tr_pop=new float *[m]; 
matingPool=new float *[m]; 
for(l=0;l<m+1;l++)//allocating 
{ 
    tr_pop[l]=new float[MAX_POPULATION]; 
    matingPool[l]=new float[MAX_POPULATION]; 
} 
for (int r = 0; r < row; ++r)//deleting 
{ 
delete [] matingPool[r];//Stops here (not ending program just frozen) 
delete [] tr_pop[r]; 
} 
delete [] tr_pop; 
delete [] matingPool; 

=======确定。问题解决了=======

这里的原因是:

我只是改变了MAX_POPULATIONMAX_POPULATION+1和它的工作。

for(l=0;l<m+1;l++) 
    { 
    tr_pop[l]=new float[MAX_POPULATION+1]; 
    matingPool[l]=new float[MAX_POPULATION+1]; 
    } 

因为在其他功能我觉得我是在做违反:

void crossover() 
{ 
int p1,p2,i,j;float tempBit; 
p1=m/3; 
p2=(2*m)/3; 
for(j=0;j<MAX_POPULATION;j++) 
{ 
    for(i=p1;i<p2;i++) 
    { 
    tempBit=matingPool[i][j]; 
    matingPool[i][j]=matingPool[i][j+1];//THE VIOLATION POINT (I THINK) 
    matingPool[i][j+1]=tempBit; 
    } 
    j++; 
} 

正如你可以看到,当j = MAX_POPULATION在循环结束时,我试图达到MAX_POPULATION + 1。所以我改变了拨款列,问题解决:)

+7

请发布''matingPool''和''tr_pop''是如何创建的。 – 2012-04-09 09:55:43

+0

@HeShiming完成。 – 2012-04-09 10:01:15

+0

内部数组中的所有数组是否都已初始化?在删除之前检查它们是否为空。 – 2012-04-09 10:01:17

回答

2

您正在运行到未定义行为:

for(l=0;l<m+1;l++)//allocating 
{ 
    tr_pop[l]=new float[MAX_POPULATION]; 
} 

for(l=0;l<m;l++)//allocating 
{ 
    tr_pop[l]=new float[MAX_POPULATION]; 
} 

你分配每个m元素阵列并尝试访问m+1

+0

,没有问题。它只是工作。我的问题是在“r”循环中。 – 2012-04-09 10:12:37

+1

@WhoCares:你的'r'循环有问题,因为你的'l'循环是_wrong_。 (还有其他的东西,比如'row'和它是如何与'm'相关的?) – Mat 2012-04-09 10:15:57

+0

@Mat我像你们说的那样改变了我的“l”循环。还是一样。它不删除数组的数组。它也会在“r”循环开始时中断(实际上不会中断,只是冻结)。所以我认为问题不在于分配,至少应该从tr_pop [0]中删除到tr_pop [m-1]。我认为这里有不对的地方 – 2012-04-09 10:24:52

1

您分配mfloat*for循环要从0..m迭代,同时分配内存,它应该从0..m-1。为此,您需要将for循环更改为:for(l=0;l<m;l++)