8

我想通过循环遍历所有元素并调用delete每个元素来删除动态分配的数组。
(我这样做是因为我必须将一个数组“移动”到另一个位置,即复制原始数组然后删除它,但这将花费 2 倍于同时复制每个元素并delete单独调用它们的时间)

我有以下代码:

int main()
{
    int *n=new int[2];
    delete n;
    delete (n+1);
}  

但是每次运行时我都会遇到分段错误....

虽然,这很好用 - :

int main()
{
    int *n=new int[1];
    delete n;
}    

所以,我的猜测是 delete 以某种方式删除了整个数组而不是单个元素!

谁能解释我的猜测是否正确,如果是,请提出可能的解决方法?

我在 Ubuntu 13.04 上使用 GCC 4.7.3

4

2 回答 2

7

您不能单独删除元素。当您分配时,new []您必须取消分配delete []。你在这里做什么:

int *n=new int[1];
delete n;  // ERROR: should be delete []

它不正确。您正在调用未定义的行为。它似乎纯属偶然,不能依赖。

至于解决方法,目前尚不清楚问题出在哪里,但如果您想“移动”数组,您可以将其分配给不同的指针:

int* n=new int[2];
...
int* m = n;
n = nullptr;
....
delete [] m;
于 2013-08-02T11:56:37.233 回答
1

删除

int *n=new int[2];

利用

delete [] n;

编码

delete n;

使用 new [] 分配时是错误的。

于 2013-08-02T12:01:31.703 回答