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

Changing an object after pushing its address to a vector

本文关键字:对象 向量 地址      更新时间:2023-10-16

我有一个问题:

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

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

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的共享内存?

感谢

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

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

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

是。毕竟,您只创建了一个对象。你推指针。所以std::vector复制指针,但是你改变了它们指向的内存。这就是你得到结果的原因。我建议你多读一些关于指针的书。

vector 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的内容复制到向量中。改变一个不会影响另一个。