【问题标题】:Placement new and destructor放置 new 和析构函数
【发布时间】:2018-01-17 08:48:56
【问题描述】:

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

【问题讨论】:

  • 请出示您的代码而不是解释它。
  • 不太清楚你到底在做什么,但一般来说,当且仅当对象可以被简单地破坏时,你可以跳过运行析构函数。
  • @BaummitAugen 在这种情况下,优化器无论如何都会这样做,所以人们不应该真正考虑它

标签: c++ destructor placement-new


【解决方案1】:

如果对析构函数的调用很简单,你可以跳过它:

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 表达式判断该类型是否可以简单地破坏。如果您在优化的情况下进行编译,大多数优化器都会为您解决这个问题,因此编写一个为块中的所有对象调用微不足道的析构函数的循环不会对性能造成影响。

【讨论】:

  • 不仅可以使用std::is_trivially_destructible<>来判断是否正常。你真的应该在 static_assert() 中使用它,以确保有人不会在 6 个月内将 string 添加到结构中,或者类似的傻事。
  • 如果结构体或其任何成员明确定义了析构函数但主体为空怎么办?
  • @user7242858 任何显式提供的析构函数被认为是微不足道的,即使它的主体是空的。
猜你喜欢
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2017-12-22
相关资源
最近更新 更多