【问题标题】:removing objects from an array从数组中删除对象
【发布时间】:2012-05-12 14:41:53
【问题描述】:

我正在创建一个使用声明的对象数组的程序

Element * elements = new Element[number];

其中一个元素是 class,它拥有/需要自己的析构函数。

当我去删除时,我会使用数组删除,让程序担心调用析构函数:

delete [] elements;

或者我是否使用关键字 delete 显式调用每个项目的析构函数:

for(int ii = 0; ii< ArraySize; ii++)
    delete elements[ii];
delete [] elements;

注意:我知道我可能会使用 boost::ptr_vector 之类的东西,但我想要类似于 hashTable 的功能(因此 for 循环需要额外的信息,但这超出了这个问题的直接范围)这就是我使用传统阵列的原因。我仍然想知道需要哪种行为来避免内存泄漏。

【问题讨论】:

  • 您没有在数组中存储指针,所以delete[] 应该可以解决问题。

标签: c++ arrays destructor


【解决方案1】:

第一个。你应该

delete [] elements;

第二个是不正确的,如果你尝试编译它应该会给你错误。

【讨论】:

  • 虽然数组中的对象需要调用析构函数,所以基本上只要删除数组就会为每个对象调用析构函数
  • 是的,delete [] elements 将为整个数组释放内存并为每个对象调用析构函数。你deletenewdelete []new []。在这里,你只做了new [],所以你只需要delete []
【解决方案2】:

是的,delete [] elements; 应该足够了。

您可以将第二段代码用于以下内容:

Element **elements;

elements = new Element *[rows];
for (int i=0; i<rows; i++)
    elements[i] = new Element;

尽管如此,这种组合很少有意义。至少从某种意义上说,每一行本身也是一个动态分配的数组:

elements = new Element *[rows];
for (int i=0; i<rows; i++)
    elements[i] = new Element[row_len];

在这种情况下,您的删除将类似于:

for (int i=0; i<rows; i++)
    delete [] elements[i];
delete [] elements;

但是,正如您现在所做的那样,您所说的任何内容都不能真正证明自制动态分配的合理性。 std::vector&lt;Element&gt; elements(number); 会很好用。

【讨论】:

  • 我想要一个哈希表功能,在操作方面甚至优于 std::vector HashTable 即使对于假设少于 75% 已满的大型表,也大约为 O(2),而即使是最好实现的向量/连续列表是 O(n),并且该数组预计可以处理大量对象。
  • @gardian06:但是你现在正在做的是创建一个连续的数组,就像std::vector 一样。要实现哈希表,您可能需要std::vector&lt;Element *&gt;。当然,对于哈希表,您的首选通常应该是std::unordered_map&lt;Element&gt;
猜你喜欢
  • 1970-01-01
  • 2016-11-26
  • 2016-05-19
  • 2011-04-04
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多