gpt4 book ai didi

c++ - clang 和 gcc 在使用智能指针时不会警告多态性的非虚基析构函数?

转载 作者:可可西里 更新时间:2023-11-01 15:45:22 26 4
gpt4 key购买 nike

我们知道 如果有虚函数那么基类析构函数也应该被标记为虚函数,否则当使用基类指针显式 删除时它是未定义的行为 如果我们希望删除带有基类指针的派生对象,基类析构函数应该被标记为虚拟的,否则就是未定义的行为。

例如,

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 similarly) 会发出这样的警告:

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();

我想这仍然会导致未定义的行为,对吧?

最佳答案

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

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

关于c++ - clang 和 gcc 在使用智能指针时不会警告多态性的非虚基析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26321216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com