假设我有一个课程 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
我俯瞰什么?
答案 0 :(得分:2)
在您的示例中,没有什么可以提醒您。一切正常。在循环的每次迭代中,您都会创建一个堆栈变量。由于循环的所有迭代都是相同的,因此堆栈上局部变量的地址是相同的。创建变量后,将其复制到向量中,并在变量和堆栈中(在向量中)具有两个具有不同地址的副本。退出迭代后,将销毁本地副本,但另一个副本将保存在向量中。在新的迭代中,显然将在与上一个迭代相同的地址处创建一个对象。
请注意,堆栈的使用取决于编译器的优化。例如,对于“发行”版本,您可能在所有四种情况下都获得相同的地址。在我的编译器上,我得到了
this = 008FFA63
this = 008FFA63
this = 008FFA63
this = 008FFA63