使用智能指针时,clang和gcc不会针对多态性使用非虚拟基本析构函数发出警告吗?

陈洪旭

我们知道, 如果有虚函数,则基类析构函数也应标记为虚函数,否则, deleted 如果我们希望使用基类指针删除 基类析构函数,则在 使用基类指针进行 显式 删除 时,这是未定义的行为。 虚拟的,否则是未定义的行为。

例如,

struct Base {
  virtual void greet() { std::cout << "base\n"; }
};

struct Derived : public Base {
  virtual void greet() override { std::cout << "derived\n"; }
};

呼叫

Base *b = new Derived;
b->greet();
delete (b);

-Wdelete-non-virtual-dtor时,clang(类似的gcc)将发出这样的警告

delete called on 'Base' that has virtual functions but non-virtual destructor

但是他们两个都没有报告关于智能指针的警告

std::unique_ptr<Base> sb = std::make_unique<Derived>();
//   std::unique_ptr<Base> sb = std::unique_ptr<Derived>(new Derived);
sb->greet();

我想这仍然会导致不确定的行为,对吗?

TC

是的,它仍然是未定义的行为。问题在于delete调用发生在std::default_delete系统标头内部的内部。默认情况下,编译器不会为系统头文件中的代码生成警告。

如果通过-Wsystem-headers,则会看到警告。不幸的是,它被埋在一堆其他警告中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用受保护的非虚拟析构函数时禁止删除非虚拟dtor警告

智能指针的多态性

优先顺序:智能指针和类析构函数

多态性基类缺少虚拟析构函数=资源泄漏?

有什么方法可以检测是否使用非虚拟基本析构函数正确删除了类?

智能指针析构函数调用的向量

具有智能指针和析构函数的Singleton类被调用

提供C2541的析构函数和智能指针

我可以使用函数指针调用虚拟析构函数吗?

非虚拟析构函数c ++的异常

C ++:使用仅具有属性的继承结构时需要实现虚拟析构函数吗?

具有虚拟和非虚拟析构函数的删除运算符的不同行为

在 Visual Studio 中使用指针时析构函数崩溃

如何使用智能指针对象执行成员函数指针?

何时使用虚拟析构函数?

特殊情况下的智能指针析构函数

在无序映射中插入智能指针调用析构函数

在具有虚拟析构函数的多态继承中使用 enable_shared_from_this

多态类中的虚拟析构函数

C++ 使用类成员和智能指针获得多态行为

编译时,GCC不会发出警告

构造函数和析构函数必须是虚拟的吗?

动态分配函数指针数组时发出警告

仅子类具有虚拟方法时使用多态性的问题

如何使用返回原始指针的函数的智能指针

为什么在使用三字组合时GCC会发出警告,而在使用二字组合时却不会发出警告?

与“受保护的虚拟析构函数”相比,拥有“受保护的非虚拟析构函数”有什么好处?

当我具有可以同时使用可变和不可变char *的函数时,如何避免发出警告

使析构函数不是虚拟的并在特殊情况下删除基本指针是否安全?