将其地址推送到向量后更改对象

时间:2012-08-23 06:41:18

标签: c++ vector

我有一个问题:

class B : public class A {
public:
  vector<int*> vec; 
};

class A  {
};

vector<A*> vec_a;
vector<B*> vec_b;

如果我将类B的对象推回到两个向量中。

B* b = new B;
vec_a.push_back(b);
vec_b.push_back(b);

之后,我改变了类B

对象内的某些内容

如:

int* i = ....
vec_b[0].push_back(i);

vec_a会改变吗?

我很困惑,因为我在向量push_back时检查过,它只会创建一个副本。但是当我检查上面的代码时,它会发生变化。这两个向量是否包含对象b的共享内存?

由于

5 个答案:

答案 0 :(得分:2)

是的,当推送到vector时,会创建一个副本。但是在您的情况下,它是指针的副本,而不是实际对象的副本。

答案 1 :(得分:1)

您在两个向量中都放置了一个指向同一对象的指针,因此对vec_a中元素指向的对象的任何更改都会影响vec_b中的元素。

答案 2 :(得分:1)

是。毕竟,您只创建一个对象。你推指针。所以std::vector复制指针,但你改变他们指向的内存。 这就是你获得结果的原因。我建议你多阅读一下指针。

答案 3 :(得分:1)

您的向量包含指向公共对象的指针。因此,您通过其中一个指针的derefence在该对象内部更改的任何内容都会反映在它们指向的对象中。将指针添加到向量会创建指针本身的副本,而不是它们指向的对象。如果您向两个向量添加了类B的公共实例,则每个向量都将包含该对象的单独副本。添加指针会导致原始指针的副本被添加到每个向量中 - 但两个副本将具有相同的值,并且是它们指向的对象的内存地址。

答案 4 :(得分:0)

矢量push_back方法确实创建了一个副本。但由于您已指定指针向量(对于vec_a和vec_b),因此复制这些指针实际上并不会更改原始对象。如果你使用了

,你会得到你最初的预期
vector<A> vec_a;
vector<B> vec_b;

相反,用

填充这些向量
B b;
vec_a.push_back(b);
vec_b.push_back(b);

实际上会将b的内容复制到矢量中。改变一个不会影响另一个。