gpt4 book ai didi

c++ - 为什么在循环中创建的对象具有相同的地址?

转载 作者:可可西里 更新时间:2023-11-01 17:45:13 26 4
gpt4 key购买 nike

我确实看到了其他一些看起来像我的问题,但我仍然无法弄清楚。

这是我的代码:

#include<iostream>
#include <vector>

using namespace std;

template<typename Data_Type>
class node {
public:
Data_Type data;
node* next;
node(Data_Type data, node* next){
this->data = data;
this->next = next;
}
};


int main(){
vector<node<int> > vectorOfNodes;
for (int i = 0; i< 4; i++){
node<int> newNode = node<int>(i,NULL);
std::cout << "new node address a "<< &newNode << "\n";
vectorOfNodes.push_back(newNode);
std::cout << "new node address b "<< &vectorOfNodes[i] << "\n";
}
for (int i = 0; i< 4; i++){
std::cout << "data "<< vectorOfNodes[i].data << "\n";
}
}

当我运行它时,“新节点地址 a ”始终是每次迭代重复的相同地址,但“新节点地址 b ”每次都是不同的地址。

new node address a 0x7fff546c39b0
new node address b 0x7fe2f8c039d0
new node address a 0x7fff546c39b0
new node address b 0x7fe2f8c039f0
new node address a 0x7fff546c39b0
new node address b 0x7fe2f8c03a20
new node address a 0x7fff546c39b0
new node address b 0x7fe2f8c03a30
data 0
data 1
data 2
data 3

我不明白为什么 a 和 b 不一样。更具体地说: &newNode 不是我刚刚创建的对象的地址吗? vectorOfNodes[i] 不是那个对象吗?那么 &vectorOfNodes[i] 不也是对象的地址吗?

最佳答案

这些东西在每门关于操作系统设计和/或编译器设计的大学类(class)中都有解释。

有问题的对象在堆栈上实例化,并且在作用域结束时,它们超出堆栈的作用域。堆栈会相应地增长和收缩,并且因为在循环的每次迭代中,都会创建(和销毁)完全相同的对象,堆栈会增长和收缩相同的量,因此相同的对象总是最终在相同的位置被实例化在堆栈上。

在实践中,编译器可以做一些优化并计算出每个函数将使用的大量堆栈,大多数时候,因此“预增长”堆栈到函数需要的大量堆栈;但这对杂草来说有点过头了......

这是我能给出的最简洁的答案,无需深入讲解堆栈是什么等等......

现在,另一个对象分配在堆上。将你的注意力集中在这样一个事实上,即在循环结束时,你填充到 vector 中的对象仍然存在,而“a”对象被销毁,你将开始看到差异.在循环的每次迭代中,都会创建“a”对象,然后在循环结束时销毁(并在循环开始时再次创建),而您填充到 vector 中的对象仍然存在。

关于c++ - 为什么在循环中创建的对象具有相同的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29785789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com