c++ - 如何在 CPP 中删除动态非矩形二维数组
问题描述
这是我为了理解使用指针而编写的一些代码。这里我要分配和显示一个二维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;
不幸的是,这会给我一个例外,即堆已损坏
我猜它崩溃是因为它不知道子数组的确切大小,但我也听说delete总是跟踪为数组分配了多少字节。
感谢您的简短回答。
解决方案
您的删除逻辑是正确的。
该错误消息意味着您的程序正在写入超出范围的内存。然而,这里的比较j <= i
并不是不正确的——我的意思是假设程序当前正在生成你想要的输出。
请注意,您希望您的第i个数组包含i+1
项目。特别注意第零个数组必须包含一项(即零),所以*(_2darray + i) = new int[i]
应该是*(_2darray + i) = new int[i+1]
。
有了这种变化,带有j <= i
比较的 for 循环是正确的。索引 j 将遍历包含项目的第i个数组中的每个i+1
项目。从零开始时,比较j < i
只会产生ij <= i
次迭代,因此在这种情况下您确实需要,即使这样的比较看起来不标准。考虑j < i+1
,这是等效的,但可能更清楚。
推荐阅读
- jetbrains-ide - 更改结果中的列标题以仅显示列名,而不是表名。列名
- spring - Spring Security Oauth2 使用基于令牌的会话登录
- r - 按特定列对数据框进行排序
- webview - 如何在我的 webview 上实现通知
- snowflake-cloud-data-platform - 通过 Okta 的雪花本机 SSO -“无法连接到 okta。错误代码 = 401”
- flutter - 如何根据颤动中的方向变化改变状态栏和导航栏的颜色
- c# - C# 基于逻辑从 Excel 列中获取值
- java - 在 log4j2.properties 中,无法从 tomcat context.xml 中读取属性
- python - 使用整数键访问 HDF5 键值存储
- javascript - 在Android的WebView中调用Javascript函数