如果您希望查看导致此问题的代码,可以在此处查看和克隆项目:https://github.com/NickChapman/RuM/tree/63047e457745558403ea807534e4f5b9930cfeb8
值得注意的是,我有一个构造函数(RuMParser.cpp
第20行):
this->globalScope = Scope();
std::cout << &(this->globalScope) << std::endl;
然后在构造函数完成后立即(RuM.cpp
第63行):
std::cout << &(this->parser.globalScope) << std::endl;
这些的输出是:
0x7fff57ac5318
0x7fff57ac6988
他们为什么不一样?对于所有剩余的时间,地址将保持固定在第二个值。离开构造函数后为什么会改变?
在第一次打印输出后立即尝试建立指针时,我注意到了这个问题。指针指向构造函数完成的第二个旧地址,我对此感到困惑。
我怀疑这与复制构造函数或某种性质有关。
编辑:如果您正在尝试构建源并运行,请参考:
cmake .
make
然后
./rum
输入x=1;$
将导致程序出现段错误。
答案 0 :(得分:2)
this->parser = RuMParser(tokenList);
std::cout << &(this->parser.globalScope) << std::endl;
首先,创建一个临时RuMParser
,这是第一次打印时。然后将临时副本构造为this->parser
。这意味着,globalScope
将再次默认构建。因此在后面的印刷中使用不同的地址。
嗯,代码中有很多可疑/非惯用的东西,但我会坚持只对这个问题有用的东西。您可以将构造函数重写为:
RuMInterpreter::RuMInterpreter():
tokenList(std::make_shared<std::vector<Token>>())
,parser(tokenList)
{
....
}
始终优先选择成员初始值设定项列表。它也是我猜的有效C ++书籍中的一个项目。