新建[n]并使用delete删除每个位置,而使用delete[]删除整个区块 < P>这是有效的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]; }

新建[n]并使用delete删除每个位置,而使用delete[]删除整个区块 < P>这是有效的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]; },c++,memory-management,C++,Memory Management,我问这个问题的原因是:我有一个使用boost::intrusive::list的类,我会新建添加到该列表中的每个对象。有时,我知道要向列表中添加多少对象,并考虑使用new[]分配一个块,但仍然能够使用boost::intrusive的Disposer样式删除每个对象。不可能。不能对new未分配的内容调用delete,否则会导致堆损坏 你看,new[]创建的数组没有分配n个单独的对象,而是一个数组。数组的第二个对象位于分配块的中间。不可能。不能对new未分配的内容调用delete,否则会导致堆损坏

我问这个问题的原因是:我有一个使用boost::intrusive::list的类,我会新建添加到该列表中的每个对象。有时,我知道要向列表中添加多少对象,并考虑使用new[]分配一个块,但仍然能够使用boost::intrusive的Disposer样式删除每个对象。

不可能。不能对new未分配的内容调用delete,否则会导致堆损坏


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

不可能。不能对new未分配的内容调用delete,否则会导致堆损坏


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

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

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


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

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


确切地而且,当您使用new或new[]分配某些内容时,它会在表中的某个位置存储一个符号,表示分配了特定的内存块。相应的delete或delete[]调用将查找该表示法。不能对new未分配的内容调用delete,否则会导致堆损坏。你撞车了!确切地而且,当您使用new或new[]分配某些内容时,它会在表中的某个位置存储一个符号,表示分配了特定的内存块。相应的delete或delete[]调用将查找该表示法。不能对new未分配的内容调用delete,否则会导致堆损坏。你撞车了!它必须与继承兼容,因为我使用侵入式::list\u base\u钩子。@pmr:ListItem当然可以从某些东西继承,但析构函数必须如图所示。出于同样的原因,在同样的意义上,C样式的对象数组与继承不兼容。@pmr:我的意思是ListItem可以从类似list\u base\u hook的东西继承。你能描述一下我是怎么不回答你的问题的吗,或者说我是怎么不投赞成票的吗?这不是一个容易回答的问题,我对下意识的“这是不可能的回答”很恼火……我的评论的目的不是说这是不可能的,我只是想增加要求。我仍然不明白你答案中与继承不相容的部分。你是说不能扩展吗?@pmr:对不起,不可能的事情不是指你;没关系。通过与继承不兼容,我的意思是您不能在基类中封装管理封闭数组的功能,至少不能使用我发布的代码。这些要求基本上与构造和销毁对象数组的要求相同,这基本上是您使用更基本的构建块重新实现的。它必须与继承兼容,因为我使用的是intrusive::list\u base\u钩子。@pmr:ListItem当然可以从某些东西继承,但是析构函数必须如图所示。出于同样的原因,在同样的意义上,C样式的对象数组与继承不兼容。@pmr:我的意思是ListItem可以从类似list\u base\u hook的东西继承。你能描述一下我是怎么不回答你的问题的吗,或者说我是怎么不投赞成票的吗?这不是一个容易回答的问题,我对下意识的“这是不可能的回答”很恼火……我的评论的目的不是说这是不可能的,我只是想增加要求。我仍然不明白你答案中与继承不相容的部分。你是说不能扩展吗?@pmr:对不起,不可能的事情不是指你;没关系。通过与继承不兼容,我的意思是您不能在基类中封装管理封闭数组的功能,至少不能使用我发布的代码。这些要求基本上与施工和拆除的要求相同 g对象数组,本质上就是您正在使用更基本的构建块重新实现的对象。
ListItem::~ListItem() {
    if ( m_own_my_subarray ) {
        operator delete[]( this ); // does not invoke any destructor!
                 // "this" must be exactly the result of new[]!
    }
}