C++ 在动态二维布尔数组中更改一个值似乎会更改不同数组中不同位置的值

C++ 在动态二维布尔数组中更改一个值似乎会更改不同数组中不同位置的值,c++,arrays,dynamic,C++,Arrays,Dynamic,我有两个大小为height*width的动态分配的布尔数组,我用它们来分配/初始化 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); } f

我有两个大小为height*width的动态分配的布尔数组,我用它们来分配/初始化

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;
    }
bool**已访问;
布尔**排队;
访问=新布尔*[高度];
inQueue=新bool*[高度];
对于(int i=0;i
在我的程序结束时,我用

for (int i = 0; i < height; i++) {
    delete [] visited[i];
    delete [] inQueue[i];
}
delete [] visited;
delete [] inQueue;
for(int i=0;i
但是,在这两者之间,我遇到了一个奇怪的情况,即visited的第0列中的各种值变为真,即使它们没有被直接更改

这种行为的一个例子是:

. . . . . . . . . . . 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 ... . . . . . . . . . . . X。0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 . . . . . . # . # . #。0 0 0 0 0 0 1 0 1 0 1 1 1 0 1 0 0 . . . . . . # . . # X X X#。0 0 0 0 0 0 1 0 0 1 1 1 1 1 1 0 0 . . . . . . # . X X X X#。0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 . . . . . . # # # # # X X#。0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 . # . . . . . . . . # X X@。0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 . # . . . . . . . . # 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 . GX 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 增加东部位置:(16,5) [6][0] @ 208: 1 [6][0] @ 210: 1 ... 这是我的输出。如您所见,[6][0]中的位置在第205行之后的输出中标记为真,同时添加了东部位置。此更改的代码如下所示:

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

cout访问[i]=new bool(width)
时,分配一个布尔值,而不是布尔数组。此后,当期望一个
width
元素的数组(实际上只包含一个元素)时,您将超出数组边界并获得未定义的行为(这就是您在输出中看到的)

请看区别:

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

所以写
visted[i]=new bool[width]
(以及
inQueue
),你至少应该领先。

bool(width)
->
bool[width]
?使用
new
后,你应该使用
删除
而不是
删除[]
!!如果我不使用delete[],我会有错误的行为。就内存而言,如果在这种情况下使用delete[]而不是delete不正确,那么它的缺点是什么?非常感谢您的快速解释。这对我来说很有效,让这样一个小错误把我搞得这么久我觉得很傻。