gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:38:12 25 4
gpt4 key购买 nike

为什么这个代码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/

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