我有一个问题:
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
的共享内存?
由于
答案 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的内容复制到矢量中。改变一个不会影响另一个。