c++ - 析构函数中函数调用的段错误

标签 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 实例调用它的。

为什么会这样?

最佳答案

这是一个悬空引用。

您通过 Derived 构造函数将字段 Base::derived 初始化为对 Derived 对象的引用,但随后您访问它在 Derived 对象被销毁后的 Base 析构函数中。

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

关于c++ - 析构函数中函数调用的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26831060/

相关文章:

c++ - 在 Mac OS X Lion 上使用 OpenMP 编译失败(memcpy 和 SSE 内在函数)

c# - c++和c#之间的共享内存同步

c++ - 如何打印 '\n' 而不是换行符?

c++ - 在 C++ 中使用 JSON 序列化 OpenCv Mat

c++ - 如何在 iOS 的 openframeworks 中构建 3d 钻石

c++ - Lapackpp 与 Boost BLAS

c++ - 如何处理全局通用框架的不稳定 API

使用文件夹结构时的 C++ undefined symbol

c++ - 在类中声明但未定义的方法

C++ STL for_each 应该采用指向带有一个参数的成员函数的指针