2017-08-09 60 views
3

我有一个简单的结构,它有固定的大小和包含内置类型。我通过分配内存块来创建内存池,并将此内存分割为我的结构体大小的块。然后它使用placement new来调用特定内存块上的构造函数以使用默认值初始化一些成员。然后我想通过调用delete []运算符来释放整个内存块。我可以安全地跳过显式的析构函数调用,每个对象使用新的位置初始化吗?我没有在该类的其他成员字段的构造函数或构造函数内找到任何资源。我只想释放整个内存块。安置新的和破坏者

+7

请显示您的代码,而不是解释它。 –

+1

目前尚不十分清楚你到底在做什么,但通常情况下,你可以跳过运行析构函数,当且仅当该对象是可破坏的。 –

+1

@BaummitAugen在这种情况下,优化器将无论如何都会这样做,所以我们不应该真的考虑它 –

回答

5

你可以跳过调用析构函数,如果它是琐碎

A trivial destructor is a destructor that performs no action. Objects with trivial destructors don't require a delete-expression and may be disposed of by simply deallocating their storage.

如果你可以告诉类型使用std::is_trivially_destructible<Type>::value表达平凡破坏。如果你使用优化进行编译,大多数优化器都会为你解决这个问题,所以编写一个循环来调用块中所有对象的琐碎析构函数不会有性能上的负担。

+1

不仅可以使用'std :: is_trivially_destructible <>'来确定它是否正常。你真的应该在'static_assert()'中使用它,以确保有人在6个月内没有向结构中添加“字符串”,或者像这样愚蠢。 – Frank

+0

如果struct或其任何成员具有显式定义的析构函数但空体? – user7242858

+1

@ user7242858任何显式提供的析构函数都被认为是微不足道的,即使它的主体是空的。 – dasblinkenlight