c++ - 持有派生类引用的基类的 std::unique_ptr 在 gcc 编译器中不显示警告,而裸指针显示它。为什么?

标签 c++ c++14 gcc-warning

我有一个基类和派生类的层次结构。基类有一个被派生类覆盖的虚函数。

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/

相关文章:

c++ - 为什么 `std::reference_wrapper` 在 c++17 中弃用并在 c++20 中删除?

c++ - 分段故障运行 boost 示例

c - mingw printf大小规范字符h

c++ - valarray 复杂度

c++ - 免费(指针)方法的性能?

c++ - 在堆上创建多维数组

c++ - "Control reaches end on non-void function"with do { 返回结果; } 而(条件);

c - 为什么 "gcc -Wall"不警告 "if (ptr < 0)"?

c++ - *buf++ = *buf + 10 - 解释

c++ - 使用 noexcept 运算符链接 noexcept 声明