涉及数组指针时delete[]操作符的问题
Questions on delete[] operator when pointer to an array is involved
以下代码可以编译,但运行错误:
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;
}
我不知道为什么"delete[] *d"不起作用,因为*d似乎是指向包含2个整数的块的指针,而delete[]应该销毁该块。
此外,我不确定"delete [] d"是否足以释放所有六个元素,因为这里涉及到二维数组。
谢谢!
您分配的内存被分配为存储int[3][2]
类型的数组对象的一个连续块(或块)内存。它应该作为一个块被释放
delete [] d;
这就是你所需要做的。
c++动态内存管理机制不支持释放整个块的部分子块。你的delete [] *d
确实是错误的-行为是未定义的。然而,它在实践中有很好的机会"工作",因为int (*)[2]
指针d
和[衰减]int *
指针*d
指向内存中的同一位置,并且底层类型是微不足道的。如果它"工作",它通常应该具有与delete [] d;
相同的效果,即释放整个2D数组。
int[3][2]
不是指针的指针,而是作为单个指针分配的多维数组。
你不能删除它的"行",因为没有行。