向量中的不同实例

Different instance inside a vector

本文关键字:实例 向量      更新时间:2023-10-16

最近我一直在试图找出一种奇怪的行为。

假设我有一个具有POD属性的类:

typedef struct {
    int a;
    vector<int> b; 
} Foo;
class Bar {
public:
    Foo foo;
    Bar(void);
    void increase(void);
};
Bar::Bar(void) {
    foo.a = 0;
}
void Bar::increase(void) {
    foo.a++;
    foo.b.push_back(foo.a);
}

如果我创建一个Bar的简单实例并使用它,这是没有问题的,但当我将它添加到向量中并通过迭代器访问它时,它会访问不同的内存位置。例如:

Bar bar1, bar2; // foo.a = 0
bar1.increase(); // foo.a = 1
vector<Bar> data({bar1, bar2});
data.begin()->increase() // foo.a = garbage ??

当一开始访问迭代器时,我希望访问bar1实例和foo属性中的a字段,并将1作为值,但它访问了一个带有垃圾的不同内存位置。

为什么会发生这种情况?

std::vector在调用push_back 时生成自己的对象副本

如果你想保持相同的对象,可以尝试一个指针向量(或者智能指针,如果你不想担心以后整理内存的话)