【问题标题】:std::enable_shared_from_this, non-virtual destructor and public inheritancestd::enable_shared_from_this,非虚析构函数和公共继承
【发布时间】:2020-11-11 09:11:20
【问题描述】:

std::enable_shared_from_this 类是一个(模板)mixin,推荐用于从给定对象(或其地址)创建共享指针,这些对象都具有对象的共同所有权。

问题是,如果你有一个 T 类:

  1. 具有虚拟方法
  2. std::enable_shared_from_this<T> 继承(并且继承必须是公开的,如上面的链接中所述;否则mixin 无用)
  3. 使用 GCC 和 -Wnon-virtual-dtor 编译(也许还有 clang,我不确定)

您会收到有关 std::enable_shared_from_this 的非虚拟析构函数的警告。

我的问题是 - 这里的错误在哪里?那就是……

  • std::enable_shared_from_this 应该有一个虚拟析构函数吗? (我不这么认为)
  • 非虚拟析构函数警告是否应采用某种标准来确定何时发出(即如果已启用)?
  • 应该保护std::enable_shared_from_this 的析构函数吗? (这甚至会起作用吗?)
  • 具有此 mixin 的类应该根本没有虚拟方法吗?

我很困惑。

【问题讨论】:

  • @MarshallClow:这肯定是相关的,但那里的讨论没有考虑我提到的两种可能的替代方案。我对那里没有提到的“受保护的 dtor”替代方案特别感兴趣。

标签: c++ compiler-warnings libstdc++ virtual-destructor enable-shared-from-this


【解决方案1】:

没有错;你的代码很好。这只是一个假阳性。警告的重点是检测代码片段,这些代码虽然是有效的 C++,但通常表明存在问题。但是“通常”并不意味着“总是”,因此大多数警告都有误报的情况,即认为有误用,而实际上没有。

std::enable_shared_from_this 应该有一个虚拟析构函数吗?

预计没有代码会删除指向enable_shared_from_this 的指针。所以没有。

非虚拟析构函数警告是否应该采用某种标准来确定何时发出(如果完全启用,那就是)?

编译器完全了解您打算做什么是不合理的。它只是看到一些通常是问题的东西,你决定让它标记。在这种情况下,这不是问题。

应该保护std::enable_shared_from_this 的析构函数吗?

没有。

带有这个 mixin 的类应该根本没有虚方法吗?

没有。

【讨论】:

  • 如果没有代码可以删除enable_shared_from_this - 那为什么该类应该有一个公共析构函数?
  • 另外,经过编辑以反映我对问题的澄清编辑。
猜你喜欢
  • 2020-06-19
  • 2011-02-04
  • 2011-05-28
  • 2017-02-17
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
相关资源
最近更新 更多