我有一个等同于此的班级。 Point
是opencv库中的一个Object。
class MyClass {
private:
double myVar;
Point myPoint;
vector<OtherClass> v;
public:
MyClass(double x, Point p) : myVar(x), myPoint(p) {
for (int i = 0; i < 5; i++)
v.push_back(p);
cout << &myVar << "," << &v << "," << &myPoint << "," << v.size() << endl;
}
}
在main
中,我构建了像这样的对象
vector<MyClass> vec;
for (int i = 0; i < 20; i++)
vec.push_back(MyClass(2, Point(0,0)));
输出:
0x7fff5291ba58,0x7fff5291ba60,0x7fff5291ba70,5
0x7fff5291ba58,0x7fff5291ba60,0x7fff5291ba70,5
0x7fff5291ba58,0x7fff5291ba60,0x7fff5291ba70,5
0x7fff5291ba58,0x7fff5291ba60,0x7fff5291ba70,5
0x7fff5291ba58,0x7fff5291ba60,0x7fff5291ba70,5
当我堆栈分配MyClass
es的向量并将MyClass
的实例推送到其上时,到控制台的输出完全相同。我对C ++不是很熟悉,但我希望所有打印的地址都不同,因为它们引用了不同的对象。如果我不正确并且所有实例都指向同一个对象,我希望共享向量的大小继续增长。但是,所有打印的值保持完全相同。
任何人都可以解释原因吗?
答案 0 :(得分:2)
除非您使用emplace_back
,否则实际构建所有这些MyClass
对象的位置在您执行push_back
的函数中,并且可能是您使用的任何方法这样做会导致每次首次构建临时MyClass
。每个临时构造的内存可以重新用于下一个临时构造。
如果您还为MyClass
的复制和移动构造函数添加了此输出,那么您将看到最终存在于容器中的实际MyClass
实例中的值。
这个答案是我能做的最好的,没有任何代码需要检查。
答案 1 :(得分:1)
你没有发布创建MyClass实例的代码并将它们推送到向量上,但我怀疑它们是在堆栈的同一个临时位置创建的(所以具有相同的地址),并且然后被复制(通过vector :: push_back)到它们的目标位置。如果添加一个成员函数来打印成员字段的地址,然后在向量中的实例上调用它,您将看到地址不同。
或者,如果你使用vector :: emplace_back,那么它将在向量的正确位置创建对象,你会看到构造函数打印的不同地址。