2017-10-03 3 views
0

における異なる場所で動的2Dブール配列は、一見...私が/で初期化割り当てたサイズの高さ*幅二動的に割り当てられたブール値のアレイを有し、異なるアレイ

bool ** visited; 
bool ** inQueue; 
visited = new bool * [height]; 
inQueue = new bool * [height]; 
for (int i = 0; i < height; i++) { 
    visited[i] = new bool(width); 
    inQueue[i] = new bool(width); 
} 

for (int i = 0; i < height; i++) 
    for (int j = 0; j < width; j++) { 
     visited[i][j] = false; 
     inQueue[i][j] = false; 
    } 
の値を変更に一つの値を変更します

そして、私のプログラムの最後に、私は

for (int i = 0; i < height; i++) { 
    delete [] visited[i]; 
    delete [] inQueue[i]; 
} 
delete [] visited; 
delete [] inQueue; 

...と、そのメモリをクリア。しかし、その間に、私は彼らがいない場合であってもの訪問0番目の列でさまざまな値がtrueになる奇妙な条件を得ます直接変更される。

この動作の例は以下のとおりです。

 
    . . . . . . . . . . . X . . . . .  0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 
    . . . . . . # . # . X X X . # . .  0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 0 0 
    . . . . . . # . . # X X X X # . .  0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 0 0 
    . . . . . . # . X X X X X X # . .  0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 
    . . . . . . # # # # # X X X # . .  0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 
    . # . . . . . . . . # X X X X @ .  0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 
    . # . . . . . . . . # X X X X . .  1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 
    . # . . . . . . . . # X X X . . .  0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 
    . G # . . . # # # . # X X . # . .  0 0 1 0 0 0 1 1 1 0 1 1 1 0 1 0 0 
    . # . . . . . . . . . X . . . . .  0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 
    . . . . . . . . . . # . . . . . .  0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 
    . . . . . . . . . . . . . . . . .  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    . . . . . . . . . . . . . . . . .  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    . . . . . . . . . . . . . . . . .  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
    . . . . . . # . . . . . . . # . .  0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 
    . . . . . . # . . . . . . . # . .  0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 
    . . . . . . # . . . . . . . # . .  0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 

    [6][0] @ 205: 0 
    Added Eastern Pos: (16, 5) 
    [6][0] @ 208: 1 
    [6][0] @ 210: 1 
    ...

は、これが私の出力です。ご覧のように、私の出力で205行目以降にラベルを付けたものは、visited [6] [0]の位置が真となり、東部の位置が追加されます。その変化をコードはここにある:

cout << "[6][0] @ 205: " << visited[6][0] << endl; 
cout << "Added Eastern Pos: (" << (east % width) << ", " << (int)floor(east/width) << ")\n"; 
inQueue[(int)floor(east/width)][east % width] = true; 
cout << "[6][0] @ 208: " << visited[6][0] << endl; 
xVal.addToQueue(to_string(east % width)); 

具体3行目にI(上記ブロックに見られるように)直後次いでinQueueの値を変更し、[6]訪問[0]はTrueに変更されています。 、

(int型)床(東/幅)

は、実際に5である、と

東%幅

だから16であることに注意してください私には、訪問したものは何でも変わってしまうのは意味をなさない。これはプログラムの実行中に徐々に発生し、常に0番目の列の値が変更されます。

アイデア?

+1

'bool(width)' - > 'bool [width]'? –

+0

'new'を使った後は' delete [] 'ではなく' delete'を使うべきです!! – CIsForCookies

+0

私はdelete []を使わないと誤った動作をします。メモリの面では、この文脈で間違っていると削除の上にdelete []を使うことの欠点は何でしょうか? –

答えて

0

visited[i] = new bool(width)では、ブール値の配列ではなく、単一のブール値を割り当てます。これ以降、実際には1つだけのwidth要素の配列を期待すると、配列の境界を超えて未定義の動作が発生します(これは出力に表示されます)。だから、visited[i] = new bool[width]を書く(ともinQueue用)

int main() { 
    int width =20; 
    int sizeofBool = sizeof(bool(width)); // -> 1 
    int sizeOfBoolArray = sizeof(bool[width]); // -> 20 
} 

、あなたは少なくとも出世する必要があります

は、違いを参照してください。

+1

簡単な説明に感謝します。これは私のために働いた、と私はそのような小さなエラーが私をあまりにも長い間混乱させるために愚かに感じる。 –

関連する問題