c++ - 成员对象的地址在构造函数之后立即发生变化

标签 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;$ 将导致程序出现段错误。

最佳答案

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

关于c++ - 成员对象的地址在构造函数之后立即发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40858801/

相关文章:

c++ - std::vector 崩溃?

ios - 在哪里以及如何__bridge

c++ - 在初始化列表中创建的 C++ 值是否进入堆栈?

c++ - Omnet + MySQL 不工作

c++ - 模板函数的模板参数

c++ - 将初始化列表包装在括号内有什么影响?

c - 通过指针访问结构[c]

c - 删除链表中间的节点

c++ - 将负数存储在无符号整数中

c++ - 扩展 std::thread 的 ref 对象传递范围