将对象的地址推送到向量后更改对象
Changing an object after pushing its address to a vector
我有一个问题:
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的内容复制到向量中。改变一个不会影响另一个。
相关文章:
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 从多个源构造一个对象,包括一个对象向量
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 对象 C++ 向量的 STL 容器
- 初始化C++中的对象向量
- 从自定义类获取对象向量中的 max 元素
- 如何在 c++ 中打印存档中的对象向量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 尝试重载输出运算符时,我无法遍历对象向量
- 如何在C++中打印对象向量的内容
- 打印出对象向量中的每个元素C++
- 在 c++ 的构造函数中分配对象向量时出错
- 遍历对象向量,并找到与从文本文件中提取的对象匹配的变量
- 对象向量是否在堆或堆栈上分配C++?
- 基于不同字段的对象向量的排序功能
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 用rapidjson读取子对象向量
- 尝试使用比较运算符对对象向量进行排序
- 如何用对象向量重载 cin(>>)
- 如何将某个元素从shared_ptr擦除到对象向量?