我有一个基类A和一个派生类B:
class A
{
public:
virtual f();
};
class B : public A
{
public:
B()
{
p = new char [100];
}
~B()
{
delete [] p;
}
f();
private:
char *p;
};
Run Code Online (Sandbox Code Playgroud)
出于任何原因,析构函数永远不会被调用 - 为什么?我不明白这一点.
我们知道如果有虚函数那么基类析构函数也应该被标记为虚拟,否则当显式地如果我们希望删除带有基类指针的派生对象,则基础析构函数应该被标记为虚拟,否则是未定义的行为.deleted使用基类指针时它是未定义的行为
例如,
struct Base {
virtual void greet() { std::cout << "base\n"; }
};
struct Derived : public Base {
virtual void greet() override { std::cout << "derived\n"; }
};
Run Code Online (Sandbox Code Playgroud)
呼叫
Base *b = new Derived;
b->greet();
delete (b);
Run Code Online (Sandbox Code Playgroud)
-wdelete-non-virtual-dtor时,clang(类似gcc)会发出这样的警告:
delete called on 'Base' that has virtual functions but non-virtual destructor
Run Code Online (Sandbox Code Playgroud)
但他们都没有报告智能指针的警告:
std::unique_ptr<Base> sb = std::make_unique<Derived>();
// std::unique_ptr<Base> sb = std::unique_ptr<Derived>(new Derived);
sb->greet();
Run Code Online (Sandbox Code Playgroud)
我想这仍然导致未定义的行为,对吧?