2012-04-09 52 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++)