gpt4 book ai didi

c++ - 如何正确填充在堆上分配的二维数组?

转载 作者:行者123 更新时间:2023-11-27 22:37:01 24 4
gpt4 key购买 nike

我在堆上创建了一个二维数组。我想用数字填充数组。我已经尝试了两种方法来做到这一点。第一次尝试是可行的,但问题是当我尝试删除它时程序会崩溃。我所做的第二次尝试使我可以在使用数组后将其删除,但数组的填充方式不正确。

下面是我声明二维数组的方式:

int** matrix = new int*[rowSize];
for (int i = 0; i < rowSize; i++) {
matrix[i] = new int[ColSize];
}

然后我这样填写:

int matrixI0[]{1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1};
int matrixI1[]{1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1};
int matrixI2[]{1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1};
int matrixI3[]{1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1};
int matrixI4[]{1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1};
int matrixI5[]{1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1};
int matrixI6[]{0, 0, 1, 0, 0, 0, 1, 1, 1, 0 ,0, 1};


matrix[0] = matrixI0;
matrix[1] = matrixI1;
matrix[2] = matrixI2;
matrix[3] = matrixI3;
matrix[4] = matrixI4;
matrix[5] = matrixI5;
matrix[6] = matrixI6;

当我以这种方式填充它时,数组会按照我想要的方式运行,并且我在稍后使用此数组的方法中得到了预期的结果。

但是当我尝试删除它时:

    for (int i = 0; i < rowSize; ++i) {
delete[] matrix[i];
}
delete[] matrix;

我收到一个抛出的异常,并显示以下错误消息“Test.exe 已触发断点。”当然,如果我在发行版中运行它,程序就会崩溃。

我第二次尝试填充数组是这样的:

int matrixI0[]{1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1};
int matrixI1[]{1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1};
int matrixI2[]{1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1};
int matrixI3[]{1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1};
int matrixI4[]{1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1};
int matrixI5[]{1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1};
int matrixI6[]{0, 0, 1, 0, 0, 0, 1, 1, 1, 0 ,0, 1};


matrix[0][0] = *matrixI0;
matrix[1][0] = *matrixI1;
matrix[2][0] = *matrixI2;
matrix[3][0] = *matrixI3;
matrix[4][0] = *matrixI4;
matrix[5][0] = *matrixI5;
matrix[6][0] = *matrixI6;

现在当我删除数组时没有问题,但现在数组没有按照我想要的方式运行,当我测试使用数组的方法时,我得到的结果与数组会一样只是被零填满了。

我知道我在第二次尝试中没有做对,但我这样做只是为了看看必须做什么才能成功删除数组。

总而言之,我的问题是我应该如何以正确填充的方式填充二维数组,但它也会被成功删除?

谢谢!

最佳答案

快速回答:不要使用原始数组,它是 C++,只需使用 std::vector<int>/std::array<int>正确重载 operator=他们会为您完成工作,例如:

std::vector<std::vector<int>> matrix(7);
matrix[0] = { 1, 3, 3};

长答案:

您不是在堆上填充数组,而是在 matrix 中替换它们的引用本地数组在退出范围时会被删除,并且在任何情况下都无法删除。

为了解释这个问题,让我们保持简单,假设堆上有一个数组

int* row = new int[rowSize];

所以你有一个变量行,它存储一个内存地址到分配在堆上的数组:

| row | ------> |x|x|x|x|x|x|x|

现在你可以:

int myRow[] = { 1, 2, 3};
row = myRow;

发生的事情是 myRow分配在堆栈上,其地址存储在 row 中最终出现如下情况的变量:

| row |         |x|x|x|x|x|x|x|
|
--> |y|y|y|y|y|y|y|

因此,您丢失了对堆上数组和 row 的任何引用指向堆栈上的地址。你不能删除 row money 和它指向的数据在退出范围时将变成垃圾。你最终没有复制任何东西。

要正确复制数据,您可以使用 std::copy ,例如:

int myRow[] = { 1, 2, 3};
std::copy(myRow, myRow + rowSize, row);

关于c++ - 如何正确填充在堆上分配的二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52993673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com