我有一个简单的结构体,它具有固定的大小并包含内置类型。我通过分配一块内存来创建内存池,并将此内存拆分为我的结构体大小的块。然后使用placement new在特定的内存块上调用构造函数来初始化某些成员变量的默认值。然后我想通过调用delete[]运算符释放整个内存块。对于每个使用placement new初始化的对象,我可以安全地跳过显式析构函数调用吗?我没有在构造函数或该类的其他成员字段的构造函数中定位任何资源。我只是想释放整个内存块。
如果析构函数是平凡的,则可以跳过对它的调用:
平凡析构函数是指不执行任何操作的析构函数。具有平凡析构函数的对象不需要使用delete-expression进行处理,并且可以通过简单地释放其存储来处理。
您可以使用std::is_trivially_destructible<Type> ::value
表达式判断类型是否为平凡可销毁的。如果启用了优化编译,大多数优化器将为您解决此问题,因此编写循环以调用块中所有对象的平凡析构函数将不会影响性能。
std::is_trivially_destructible<>
来确定是否可以,而且你真的应该在 static_assert()
中使用它,以确保在6个月后没有人会向结构体中添加一个 string
或其他类似的东西。 - user4442671