2016-10-10 65 views
0

下面的代码编译,但有错误运行:问题上删除[]当指针数组参与运营商

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 []应该会破坏该块。

此外,由于涉及到二维数组,因此我不确定是否“delete [] d”足以释放所有六个元素。

谢谢!

+1

'删除'你什么'新',只有你'新'。这里的新表达式返回'd',而不是'* d',而不是'*(d + 1)'。 – aschepler

+0

int(* d)[2]'说“'* d'是一个两个整数的数组”。数组不是指针。 – molbdnilo

回答

4

您分配的内存被分配为一个连续块(或块)的内存,其中存储了一个数组对象int[3][2]类型。它应该被释放为一个块

delete [] d; 

这就是你需要做的。

C++动态内存管理机制不支持释放整个块的某些部分子块。

您的delete [] *d确实是错的 - 行为未定义。但是,由于int (*)[2]指针d和[decayed] int *指针*d指向内存中的相同位置,并且基础类型很简单,所以它在实践中有很好的“工作”机会。如果它“有效”,它通常应该具有与delete [] d;相同的效果,即释放整个2D阵列。

0

int[3][2]不是指针的指针,而只是一个多维数组,分配为单个指针。

您不能删除它的“行”,因为没有行。内存是连续的。