我有一个基类和派生类的层次结构。基类有一个被派生类覆盖的虚函数。
class Base
{
public:
~Base();
virtual void other_functionality() = 0;
};
class Derived : public Base
{
public:
~Derived ();
void other_functionality() {//some code};
};
现在如果我这样做:
int main()
{
Base * P = new Derived ();
delete p;
return 0;
}
报错:
删除具有非虚析构函数的多态类类型的对象。
但是使用 unique_ptr 它会毫无警告地通过。
int main()
{
std::unique_ptr<Base> p;
p.reset(new Derived ());
return 0;
}
我知道我是否使用虚拟析构函数。裸指针警告将得到解决。但是问题仍然存在 - 为什么没有虚拟析构函数会显示裸指针而不是 unique_ptr 的问题。
最佳答案
首先,当基类没有虚拟析构函数时,通过基指针删除派生对象是未定义的行为。编译器不需要诊断未定义的行为……
话虽如此,使用 std::unique_ptr
时没有出现此警告的原因很可能是由于 GCC does not report warnings that would appear in system headers .
关于c++ - 持有派生类引用的基类的 std::unique_ptr 在 gcc 编译器中不显示警告,而裸指针显示它。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55848866/