放置new和析构函数

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

7
请展示你的代码,而不是解释它。 - Ahmad Khan
1
不太清楚你具体在做什么,但通常情况下,只有当对象是平凡可析构的时才可以跳过运行析构函数。 - Baum mit Augen
1
@BaummitAugen 在这种情况下,优化器会自动完成,所以我们不需要过多考虑。 - David Haim
1个回答

4

如果析构函数是平凡的,则可以跳过对它的调用:

平凡析构函数是指不执行任何操作的析构函数。具有平凡析构函数的对象不需要使用delete-expression进行处理,并且可以通过简单地释放其存储来处理。

您可以使用std::is_trivially_destructible<Type> ::value 表达式判断类型是否为平凡可销毁的。如果启用了优化编译,大多数优化器将为您解决此问题,因此编写循环以调用块中所有对象的平凡析构函数将不会影响性能。


2
不仅可以使用 std::is_trivially_destructible<> 来确定是否可以,而且你真的应该在 static_assert() 中使用它,以确保在6个月后没有人会向结构体中添加一个 string 或其他类似的东西。 - user4442671
如果结构体或其任何成员都有显式定义的析构函数,但是函数体为空,会怎样? - user7242858
1
@user7242858 任何明确提供的析构函数都不被视为平凡,即使其主体为空。 - Sergey Kalinichenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接