C++ C++;for循环中的init multiple class对象是否提供相同的内存地址?

C++ C++;for循环中的init multiple class对象是否提供相同的内存地址?,c++,memory,initialization,C++,Memory,Initialization,我的代码片段如下所示,但当我有2个自定义类并定义它们并打印它们的内存地址时: for(int i=0;i<2;i++){ Engine b; Strategy d; std::cout<<"be:"<<&b<<std::endl; std::cout<<"elm:"<<&d<<std::endl; } for(inti=0;i显而

我的代码片段如下所示,但当我有2个自定义类并定义它们并打印它们的内存地址时:

for(int i=0;i<2;i++){
    Engine b;
    Strategy d;
    std::cout<<"be:"<<&b<<std::endl;
    std::cout<<"elm:"<<&d<<std::endl;
}
for(inti=0;i显而易见的方法是

Engine b[2];
Strategy d[2];
for(int i=0;i<2;i++){
    std::cout<<"be:"<<&b[i]<<std::endl;
    std::cout<<"elm:"<<&d[i]<<std::endl;
}
发动机b[2];
战略d[2];

对于(int i=0;i,您输出的两个变量应该只有一个唯一的内存地址be,它等于

0x7ffd92aee2c0

输出了两次,没有任何变化

然后

elm:0x7ffd92aede70

如果是同一个场景,您输出了两次,没有任何变化,您期望有什么不同

代码运行得非常好

我希望有两组不同的内存地址

没有理由期待。在下一次迭代开始时,上一次迭代中自动对象的生存期已经结束,因此下一次迭代中的对象可以重用相同的存储,即,它可以具有相同的内存地址

有人能告诉我如何输入不同的地址吗


您不能指定分配自动存储持续时间的对象的内存位置。但是,如果您创建两个生命周期重叠的对象,则它们必须存储在单独的地址中。john在其中演示了如何使用数组来实现这一点。

每次创建块时,都会创建块范围内创建的对象每次块离开时,都会对其进行居中和销毁。在循环的情况下,您的对象
b
d
将分别在每次迭代的开始和结束时创建和销毁。因此,每次迭代都会得到“新”对象,但编译器可以自由使用任何地址(甚至是用于上一次迭代的对象的地址),因此您可能会一次又一次地看到相同的地址。但也可能会得到不同的地址。无论如何,依赖对象的内存地址是没有意义的,因为对象的生命周期已经结束/将要结束,所以更有趣的问题是:“您为什么关心
e
d
的内存地址?”

要了解发生的情况,请尝试以下代码。它显示了在程序过程中如何创建和销毁对象:

class TestClass {
public:
    TestClass (int x=0) : x (x) { cout << "Constructing " << x << endl; };
    TestClass (const TestClass& t) : x (t.x) { cout << "CopyConstructing " << x << endl; };
    TestClass (const TestClass&& t) : x (t.x) { cout << "Moving " << x << endl; };
    ~TestClass () { cout << "Destructing " << x << endl; };

    int x;
};

int  main() {

    for(int i=0;i<2;i++){
        TestClass b(i);
        std::cout<<"elm:"<<&b<<std::endl;
    }    
}

为什么你认为它们应该有不同的内存地址?它们都是循环体的本地地址,这有什么区别?每次通过循环,对象都会被构造然后被破坏。编译器每次都使用相同的内存,因为为什么不呢?你想得对。一旦它们被破坏,内存就没有理由被破坏ey曾经不再被使用。我明白了,伙计们,感谢yall的回答。我觉得自己很愚蠢,因为很明显,它是在重复使用旧的内存加法。这没有抓住要点——不是单个变量的一个地址被输出两次,而是两个不同范围的变量的两个地址恰好是相同的
Constructing 0
elm:0x7fff5fbff780
Destructing 0
Constructing 1
elm:0x7fff5fbff780
Destructing 1