以下代码编译但运行错误:
int main() {
int (*d)[2] = new int[3][2];
// do something
delete [] *d; // this is wrong
delete [] *(d+1); // this is also wrong
//delete [] d; // this works
return 0;
}
我不知道为什么"删除[] * d"不起作用,因为* d似乎是一个指向包含2个整数的块的指针,delete []应该销毁该块。
此外,我不确定"删除[] d"足以释放所有六个元素,因为这里涉及二维数组。
谢谢!
答案 0 :(得分:4)
您分配的内存被分配为一个连续的块(或块)内存,用于存储int[3][2]
类型的数组对象。它应该被释放为一个块
delete [] d;
这就是你需要做的一切。
C ++动态内存管理机制不支持释放整个块的部分子块。
您的delete [] *d
确实是错误的 - 行为未定义。但是,它有很好的机会"工作"实际上,因为int (*)[2]
指针d
和[decayed] int *
指针*d
指向内存中的相同位置,而基础类型是微不足道的。如果"工作",它通常应该与delete [] d;
具有相同的效果,即释放整个2D数组。
答案 1 :(得分:0)
int[3][2]
不是指针的指针,而只是一个多维数组,分配为单个指针。
你无法删除" line"因为没有线条。记忆是连续的。