c++ - 为什么不使用 "new"运算符创建的对象得到相同的地址

标签 c++ new-operator

通过 this question ,一个答案说创建的对象在其范围之外被销毁,为了清楚地理解这个概念,我编写了以下代码:

#include <iostream>

using namespace std;

struct Node{
    int val;
    Node *next;
    Node(int x) : val(x) , next(NULL){}
};

int main(){
    for(int i=0;i<10;i++){
        int someval = rand()%100;
        Node somenode = Node(someval);
        printf("Address for object %d is %p \n",i+1, &somenode);
    }
}

我得到了以下输出:

Address for object 1 is 0x7ffc32ff26b0 
Address for object 2 is 0x7ffc32ff26b0 
Address for object 3 is 0x7ffc32ff26b0 
Address for object 4 is 0x7ffc32ff26b0 
Address for object 5 is 0x7ffc32ff26b0 
Address for object 6 is 0x7ffc32ff26b0 
Address for object 7 is 0x7ffc32ff26b0 
Address for object 8 is 0x7ffc32ff26b0 
Address for object 9 is 0x7ffc32ff26b0 
Address for object 10 is 0x7ffc32ff26b0 

我知道每次循环迭代时都会销毁每个对象并创建一个新对象;但为什么他们都有相同的地址。当我创建一个链表时,我遇到了这个问题,我没有使用 new 运算符来创建对象,而是使用了相同的代码,并且列表总是指向相同的节点,我遇到了一个无限循环。为什么每个对象都分配了相同的地址?

最佳答案

您继续在 stack 的顶部创建对象,然后删除它(对象在每次循环迭代结束时超出范围,并在下一次迭代之前被解构)。因此,每次为对象分配空间时,栈顶地址都是相同的。

如果您删除循环并连续分配多个 Node,随着堆栈的增长,您将看到每个节点的不同地址。

关于c++ - 为什么不使用 "new"运算符创建的对象得到相同的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44360004/

相关文章:

c++ - 为什么执行时方法解析比编译时解析快?

c++ - 使用c++在单链表的指定位置插入节点时出现段错误

c++ - 无法创建新的 wchar_t *

C++链接二叉搜索树(DeleteTree)

java - 在java中,为什么在数据类型之前不使用new运算符来分配内存?

c++ - 这些用法有什么区别 : new SubElement() and SubElement()?

c++ - 带有 GLUT 的 OpenGL - 黑屏

C++令人困惑的状态变量行为

c++ - vector 分配是否会使 `reserve` 无效?

C++ 指针和对象实例化