new [n]并删除每个删除位置而不删除整个块删除[]

时间:2010-03-18 23:18:21

标签: c++ memory-management

这是有效的C ++(例如没有调用UB)并且在没有泄漏内存的情况下实现了我想要的吗? valgrinds抱怨freedelete不匹配,但最后说“不可能泄漏”。

int main() {
  int* a = new int[5];
  for(int i = 0; i < 5; ++i)
    a[i] = i;

  for(int i = 0; i < 5; ++i)
    delete &a[i];
}

我问的原因是:我有一个类使用boost::intrusive::listnew每个添加到该列表的对象。有时我知道有多少对象要添加到列表中,并且正在考虑使用new[]来分配一个块,并且仍然可以delete使用Disposer样式boost::intrusive自己的每个对象{{1}} 1}}。

2 个答案:

答案 0 :(得分:8)

没办法。您不能在未被新分配的内容上调用delete,否则会导致堆损坏。

你看,new []创建的数组没有分配n个单独的对象,而是分配了一个数组。数组的第二个对象位于分配块的中间。

答案 1 :(得分:1)

您可以添加一点,以便每个对象都记住它是否是连续数组中的第一个。这很棘手:

  • delete object语法完全不兼容
  • 与继承不兼容
  • disposer显式调用析构函数,例如object.~ListItem()
  • 仍必须使用数组operator new[]
  • 请确保以相反的顺序处理对象,与您提供的示例
  • 不同
  • 析构函数通过其第一个元素实现数组的反射所有权:

ListItem::~ListItem() {
    if ( m_own_my_subarray ) {
        operator delete[]( this ); // does not invoke any destructor!
                 // "this" must be exactly the result of new[]!
    }
}