循环中的构造函数问题



假设我有一个类a。我想创建一些A类型的对象,并将它们推到向量中。有很多方法可以做到这一点,特别是下面所示的两种方法
第一个使用for循环,第二个不使用。

显然,它们应该是等价的,但是,如果我在新对象的构造函数中打印this,则循环中的对象共享相同的地址。我期待

#include <iostream>
#include <vector>
class A {
public:
A();
~A();
};

A::A() {
std::cout << "this = " << this << std::endl;
}
A::~A() {}
int main() {
std::vector<A> v;
// Way 1 (with for loop)
for (unsigned i = 1; i <= 2; i++)
v.push_back(A());
// WAY 2 (without for)
v.push_back(A());
v.push_back(A());
return 0;
}

输出为:

this = 0x7ffe8ac35ef9     <- these two are the same
this = 0x7ffe8ac35ef9     <- 
this = 0x7ffe8ac35efa
this = 0x7ffe8ac35efb

我在俯瞰什么?

在您的示例中,没有任何内容可以提醒您。一切正常。在循环的每次迭代中,都要创建一个堆栈变量。由于循环的所有迭代都是相同的,因此堆栈上局部变量的地址是相同的。创建变量后,将其复制到一个向量中,并在堆栈和堆(在向量中(上拥有两个具有不同地址的变量副本。退出迭代后,局部副本将被销毁,但另一个副本将保存在向量中。显然,在新的迭代中,将在与上一次迭代相同的地址创建一个对象。

请注意,堆栈的使用取决于编译器的优化。例如,对于"Release"版本,您可能在所有四种情况下都得到相同的地址。在我的编译器上,我得到了

this = 008FFA63
this = 008FFA63
this = 008FFA63
this = 008FFA63

最新更新