这是有效的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];
}
我问的原因是:我有一个类使用boost::intrusive::list
和new
每个添加到该列表的对象。有时我知道有多少对象要添加到列表中,并且正在考虑使用new[]
来分配一个块,并且仍然可以delete
使用Disposer样式boost::intrusive
自己的每个对象{{1}} 1}}。
答案 0 :(得分:8)
没办法。您不能在未被新分配的内容上调用delete,否则会导致堆损坏。
你看,new []创建的数组没有分配n个单独的对象,而是分配了一个数组。数组的第二个对象位于分配块的中间。
答案 1 :(得分:1)
您可以添加一点,以便每个对象都记住它是否是连续数组中的第一个。这很棘手:
delete object
语法完全不兼容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[]!
}
}