c++ - 在循环中初始化结构体时,为什么地址总是相同的?

标签 c++ loops memory struct c++17

在c++17中,我想初始化一个结构10次并将引用它们的ptr压入堆栈。我的代码如下。

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

stack<TreeNode*> s;
for (int i = 0; i <= 9; i++) {
    TreeNode node(i);
    s.push(&node);
    cout << &node << endl;
}

但是,当我打印在每个循环中初始化的结构体的地址时,所有地址都是相同的。

0000003F439BFBA8
0000003F439BFBA8
0000003F439BFBA8
0000003F439BFBA8
0000003F439BFBA8
0000003F439BFBA8
0000003F439BFBA8
0000003F439BFBA8
0000003F439BFBA8
0000003F439BFBA8

这样就相当于下面的代码了

stack<TreeNode*> s;
TreeNode node(-1);
for (int i = 0; i <= 9; i++) {
    node.val = i;
    s.push(&node);
    cout << &node << endl;
}

我知道在c++中,new用于为堆上的对象分配新的内存块。但我还是不明白为什么地址是相同的。

如果您能帮助我或给我一些引用,我将不胜感激。

最佳答案

C++ 在循环的每次迭代中构造 TreeNode 节点。但它也会通过在每个循环结束时调用(隐式)析构函数来解构 node

这意味着内存可供重用。由于该示例足够简单,因此该内存确实会在每次循环迭代中重用。

如果您使用 new 而不使用 delete,则析构函数不会运行,并且内存无法重用。

关于c++ - 在循环中初始化结构体时,为什么地址总是相同的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68203384/

相关文章:

c++ - 在 C/C++ 中访问 c​​onst 变量的速度

c++ - 在 Unix 下的 c++ 中捕获进程终止

c++ - 如何将初始化列表构造函数添加到 STL vector

c++ - 我不明白为什么这个 while 循环是无止境的

Python:在循环中创建对象的实例

c - c/c++ 中的 gcc 编译器是否保证将指向 const 数据的全局 const 指针放置在单独的只读部分中?

c++ - NFA模拟器错误C++

python - 如何在列表中循环更多次 python 中的列表大小?

C++:为什么这段代码给我内存问题/未定义的行为?

c++ - 在 C++ 中转置大文件的最有效内存方式