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

pmr*_*pmr 1 c++ memory-management

这是有效的C++(例如,不调用UB)并且它实现了我想要的而不会泄漏内存吗?valgrinds抱怨不匹配free,delete但最后说"不可能泄漏".

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];
}
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*hua 8

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

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

  • 究竟.并且,当您使用new(或new [])分配内容时,它会在表中存储特定内存块的表示法.相应的删除(或删除[])调用将查找该表示法. (2认同)