析构函数中函数调用的分段错误

时间:2014-11-09 17:33:49

标签: c++

为什么此代码compile并正确打印"Derived"

template <class Derived>
class Base
{
public:
    Base(Derived& d) : derived(d) {}
    void f() { std::cout << "Base\n"; }
    virtual ~Base() { derived.f(); }
private:
    Derived& derived;
};

class Derived : public Base<Derived>
{
public:
    Derived() : Base<Derived>(*this) {}
    void f() { std::cout << "Derived\n"; }
};

int main()
{
    Derived d;
}

但是making Base::f virtualDerived::fBase::f虚拟原因"Base"都要打印。此外,将Derived::f更改为virtual会产生Invalid memory reference (SIGSEGV)。我希望其他两个案例打印“Derived”,因为我是从Derived实例调用它。

为什么会这样?

1 个答案:

答案 0 :(得分:2)

这是一个悬空参考。

您可以通过Base::derived构造函数将字段Derived初始化为Derived对象的引用,然后在Base析构函数之后访问Derived构造函数1}}对象已被破坏。

在销毁任何对象(通过指针或引用)之后访问它是未定义的行为,因此可能发生任何事情。