2

我有个问题:

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);

然后在那之后,我改变了 class 对象内部的一些东西B

如:

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

vec_a变化吗?

我对此感到困惑,因为我已经检查过当矢量 push_back 时,它只会创建一个副本。但是当我检查上面的代码时,它发生了变化。这两个向量是否拥有 object 的共享内存b

谢谢

4

5 回答 5

2

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

于 2012-08-23T06:45:29.770 回答
1

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

于 2012-08-23T06:44:58.537 回答
1

是的。毕竟,您只创建一个对象。你推指针。所以std::vector复制指针,但是你改变它们指向的内存。这就是为什么你会得到你的结果。我建议你阅读更多关于指针的内容。

于 2012-08-23T06:45:22.710 回答
1

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

于 2012-08-23T06:46:01.303 回答
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 的内容复制到向量中。改变一个不会影响另一个。

于 2012-08-23T07:05:33.883 回答