【问题标题】:Deleting elements of a dynamic array one-by-one逐一删除动态数组的元素
【发布时间】:2013-08-02 11:55:03
【问题描述】:

我想通过循环遍历所有元素并在每个元素上调用 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

【问题讨论】:

  • 最简单的方法是使用 C++ 标准容器(在这种情况下为std::vector)而不是动态数组,并且只需使用容器的擦除方法。但是,另一方面,你想做什么?为什么要一个一个地删除元素?
  • 实际上,我正在尝试自己制作另一个类似矢量的容器。 [只是为了更好地了解std::vectors 的工作原理]
  • @Ammol 学习 C++?好的。所以你的问题是关于向量的析构函数?这就是你试图一个一个地删除一个元素的原因?
  • 嗯..有点! ..正如问题中提到的,我试图将数组复制到另一个位置并释放原始数组... [我试图模仿std::vector::resize()操作]
  • 是的,我之前也做过同样的事情。无论如何感谢您的帮助。 :)

标签: c++ pointers memory-management dynamic-arrays


【解决方案1】:

您不能单独删除元素。当您使用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;

【讨论】:

  • 是的,但是delete (n+1) 出了什么问题?不是只有new分配的各个内存块吗??!
  • @AnmolSinghJaggi C++ 标准不允许。
  • @AnmolSinghJaggi 关键是new [] 分配了整个数组。取消分配数组的单个元素是没有意义的。操作系统可以用它们做什么?
【解决方案2】:

删除

int *n=new int[2];

使用

delete [] n;

代码

delete n;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 2018-06-29
    相关资源
    最近更新 更多