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