涉及指向数组的指针时有关delete []运算符的问题

时间:2016-10-10 19:43:47

标签: c++ arrays

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

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"足以释放所有六个元素,因为这里涉及二维数组。

谢谢!

2 个答案:

答案 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"因为没有线条。记忆是连续的。