涉及数组指针时delete[]操作符的问题

Questions on delete[] operator when pointer to an array is involved

本文关键字:操作符 问题 delete 数组 指针      更新时间:2023-10-16

以下代码可以编译,但运行错误:

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]不是指针的指针,而是作为单个指针分配的多维数组。

你不能删除它的"行",因为没有行。