代码之家  ›  专栏  ›  技术社区  ›  Stéphan Kochen

为什么从这个有一个非虚拟析构函数的地方启用共享?

  •  17
  • Stéphan Kochen  · 技术社区  · 16 年前

    -std=c++0x -Werror -Wall -Winline -Weffc++ -pedantic-errors
    

    这对我很有效。直到现在,我已经能够解决所有的障碍。但是,我需要 enable_shared_from_this ,这给我带来了麻烦。我在编译代码时得到以下警告(在我的例子中是错误的)(可能是由 -Weffc++

    base class ‘class std::enable_shared_from_this<Package>’ has a non-virtual destructor
    

    所以基本上,我对

    • 类的析构函数 预定 应该一直
    • 析构函数是空的,为什么有它呢?
    • 我无法想象有人会想通过引用删除他们的实例 .

    但我正在寻找解决这个问题的方法,所以我的问题是,有没有合适的方法来解决这个问题?而且:我认为这个析构函数是假的,是对的,还是真的有目的呢?

    3 回复  |  直到 14 年前
        1
  •  27
  •   James McNellis    14 年前

    用于子类化的类的析构函数应该始终是虚拟的,IMHO。

    只有通过指向基类的指针删除派生类的实例时,才需要基类中的虚拟析构函数。

    shared_ptr this

    析构函数是空的,为什么有它呢?

    我无法想象有人会想通过引用删除他们的实例 enable_shared_from_this .

    至于编译器警告,我会忽略或抑制它(代码中有一个注释解释为什么这样做)。偶尔,特别是在“迂腐”的警告级别,编译器警告是没有帮助的,我想说这就是其中之一。

        2
  •  10
  •   iain    16 年前

    我同意杰米的描述,但我要补充一点

    虚拟析构函数仅在您希望虚拟销毁该类的实例时才是必需的。但情况并非总是这样,如果基类不打算被销毁,那么它应该保护它不受破坏

    所以我会改变

    类的析构函数 虚幻点,伊莫。

    这将是:

    类的析构函数 永远是 事实上的 受保护的 .

        3
  •  4
  •   Jonathan Wakely    13 年前

    有没有合适的方法来处理这个问题?

    -Weffc++

    我是否正确地认为这个析构函数是假的,或者它有真正的目的?

    不,这不是假的,而且有真正的目的。 如果它没有被定义,它将被隐式声明为 public protected .