构造函数后,成员对象的地址会立即更改

时间:2016-11-29 06:01:36

标签: c++ pointers memory-management constructor memory-address

如果您希望查看导致此问题的代码,可以在此处查看和克隆项目: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;$将导致程序出现段错误。

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 ++书籍中的一个项目。