【问题标题】:Segmentation fault when calling method on base class pointer在基类指针上调用方法时出现分段错误
【发布时间】:2011-11-02 10:55:54
【问题描述】:

我正在尝试为简单的编译器构建 FSM。
我选择创建一个带有指向状态的接口指针的固定大小的数组。事实证明,这个概念是成功的,它使用了一个读取 HTML 的简单占位符 FSM。
但是,真正的 FSM 无法工作:调用状态处理方法时出现分段错误(在 0x0)。

这是实例化:

this->states[0] = new State0();
this->states[1] = new State1();
this->states[2] = new State2();
this->states[3] = new State3();
this->states[4] = new State4();
[...]

当我单步执行时,我可以看到每次分配后对应的地址都在变化。

数组是这样定义的:

#define STATE_COUNT 17
[...]
IState * states[STATE_COUNT];

IState:

class IState {
public:
    virtual ~IState() {};
    virtual int getNextState(char) = 0;
    virtual bool isFinal() = 0;
    virtual TokenType getTokenType() = 0;
};

State0,代码最小化用于测试:

class State0 : public IState
{
public:
    virtual ~State0();
    int getNextState(char c)
    {
        return 0;
    }

    bool isFinal()
    {
        return this->final;
    }

    TokenType getTokenType()
    {
        return this->tokenType;
    }
private:
    TokenType tokenType;
    bool final;
};

现在,以下代码行导致 SEGFAULT:

this->nextState = this->states[currentState]->getNextState(c);

currentState 为 0,因为它发生在第一次调用时。

所以,我认为这既不是作用域问题,也不是 NULL 指针。除了状态对象中的 NULL this 指针之外?

【问题讨论】:

  • 你确定currentState0 吗?您在通话前打印了吗?
  • 我通过了,所以是的。但与此同时,我已经发现了问题——我在切换目标文件时忘记切换包含的标题。 D:
  • 不幸的是,这是一个非常常见的错误,即使在经验丰富的程序员中我也可以向您保证!
  • 丹尼尔,欢迎来到 Stack Overflow。如果问题可能对其他人有价值,请在答案部分发布答案。在问题正文中发布答案是一种可怕的做法,它会让你被否决。如果这对任何人都没有价值,请删除它。但要小心......删除太多,你会被禁止。

标签: c++ segmentation-fault polymorphism virtual-functions


【解决方案1】:

正如 cmets 中提到的,这个问题是由于我自己的粗心造成的。我编辑了我的 Makefile 以构建其他对象,但未能在我的代码中将标题更改为新的。所以我将(“外部”类似的)新对象文件链接到其他仍然使用旧标题的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-16
    • 2020-12-27
    • 2018-02-17
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多