2012-04-09 15 views
2

forループで何が間違っているか教えてください。私はそれを実行すると、それは中断します。C++で2次元配列を削除する

#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; 

を======= OK:私はループのために、それだけで停止したことに気づいた、間違っているものを見るためにデバッグしてみました。ここ=======

を解決しようとする課題は、その理由です:

私はちょうどMAX_POPULATION+1MAX_POPULATIONを変更し、それが働きました。

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''の作成方法を投稿してください。 –

+0

@ Heeimimingを行った。 –

+0

内部配列の配列はすべて初期化されていますか?削除する前にそれらがヌルでないことを確認してください。 –

答えて

2

を:

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

あなたはそれぞれのm要素を割り当てている

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

する必要があります配列のうちm+1にアクセスしてください。

+0

は問題ありません。それだけで動作します。私の問題は "r"ループにあります。 –

+1

@WhoCares: 'l'ループが_wrong_なので、あなたは' r'ループに問題があります。 (そして '行'のような潜在的に他のもの、 'm'との関係はどうでしょう?) – Mat

+0

@Mats私はあなたのように私の" l "ループを変更しました。まだ同じ。それは、配列の配列を削除しません。また、 "r"ループの開始時に割り込み(実際には割り込みも、凍結していない)します。だから私は問題が割り当てていないと思う、少なくともtr_pop [0]からtr_pop [m-1]に削除する必要があります。私はここに何か違うものがあると思う。 –

1

あなたはmfloat*を割り当てているが、メモリを割り当て中forループの中で、あなたはそれが0..m-1から、0..mからべきで反復されています。そのためには、forループをfor(l=0;l<m;l++)に変更する必要があります。