在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/