gpt4 book ai didi

c++ - 如何在CPP中删除动态非矩形二维数组

转载 作者:行者123 更新时间:2023-12-02 10:05:07 25 4
gpt4 key购买 nike

这是我编写的一些代码,目的只是为了了解如何使用指针。
在这里我要分配并显示一个二维Pointerarray

int main()
{
constexpr int size = 10;
int** _2darray = new int* [size];

for ( int i = 0; i < size; i++ )
{
*(_2darray + i) = new int[i];
for ( int j = 0; j <= i; j++ )
{
*(*(_2darray + i) + j) = j;
}
}

for ( int i = 0; i < size; i++ )
{
for ( int j = 0; j <= i; j++ )
{
std::cout << _2darray[i][j] << " ";
}
std::cout << std::endl;
}
}

这将导致打印以下内容:
0
0 1
0 1 2
0 1 2 3
0 1 2 3 4
0 1 2 3 4 5
0 1 2 3 4 5 6
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7 8 9

但是,如果我现在想防止内存泄漏,我想这样做:
for ( int i = 0; i < size; i++ )
{
delete[] _2darray[i];
}
delete[] _2darray;

不幸的是,这将给我一个异常(exception),即堆已损坏

enter image description here

我猜想它崩溃是因为它不知道子数组的确切大小,但是我也听说 delete 总是跟踪为数组分配多少字节。

感谢您的简短回答。

最佳答案

您的删除逻辑是正确的。

该错误消息表示您的程序正在写入超出范围的内存。比较j <= i并不是这里的错误-我的意思是假设程序当前正在生成所需的输出。

只是请注意,您希望第ith个数组包含i+1项。特别注意第零个数组必须包含一项(即零),因此*(_2darray + i) = new int[i]应该是*(_2darray + i) = new int[i+1]

有了该更改,带有j <= i比较的for循环就正确了。索引j将遍历ith数组中包含i+1项的每个项。从零开始时,比较j < i仅产生i次迭代,因此,即使这种比较是非标准的,在这种情况下您也需要j <= i。考虑j < i+1,它是等效的,但可能更清晰。

关于c++ - 如何在CPP中删除动态非矩形二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60572551/

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