C++ C++;向量推回产生奇怪的副作用

C++ C++;向量推回产生奇怪的副作用,c++,pointers,vector,reference,C++,Pointers,Vector,Reference,当我使用STL vector存储类对象时,我观察到一个非常奇怪的副作用,即push_back方法修改现有数据 基本上,我有一个包含以下几个字段的类: class MyClass { MyClass(std::string s, int i) { StringValue = s; IntValue = i; } std::string StringValue; int IntValue; } 我有一个向量,它包含指向MyClass

当我使用STL vector存储类对象时,我观察到一个非常奇怪的副作用,即push_back方法修改现有数据

基本上,我有一个包含以下几个字段的类:

class MyClass {
    MyClass(std::string s, int i) {
        StringValue = s;
        IntValue = i;
    }

    std::string StringValue;
    int IntValue;
}
我有一个向量,它包含指向MyClass对象的指针。。然后我基本上把对对象的引用向后推:

std::vector<MyClass*> MyVector;
MyClass c1("CLASS 1", 1);
MyClass c2("CLASS 2", 2);

MyVector.push_back(&c1);
// Result:
// *MyVector[0]    ==>    ("Class 1", 1)



MyVector.push_back(&c2);
// Result:
// *MyVector[0]    ==>    ("Class 2", 2)   ??why 2??
// *MyVector[1]    ==>    ("Class 2", 2)
std::vector MyVector;
MyClass c1(“类别1”,1);
MyClass c2(“类别2”,2);
MyVector.push_back(&c1);
//结果:
//*MyVector[0]==>(“1类”,1)
MyVector.push_back(&c2);
//结果:
//*MyVector[0]==>(“2类”,2)??为什么是2??
//*MyVector[1]==>(“第2类”,第2类)
你看到我得到的奇怪结果了吗??我在每个push_-back语句后都设置了断点,然后发生了一件奇怪的事情

第一个push_-back语句运行良好。但是第二个push_-back语句修改了第一个元素的内容,这对我来说没有意义

我假设这与我在向量中存储引用而不是实际对象有关。。。。但我不知道怎么了

我如何处理这个问题?有什么见解吗

谢谢


更新:

(简化代码)

MyClass c1(“类别1”,1);
MyClass c2(“类别2”,2);
我的班级温度;

而(inti=0;i我要冒险,用我的精神力量来推导出真正的代码,而不是问题中的简化代码。你的真正代码看起来像…drumroll

class MyClass {
    // ...
};

void addInstance(std::vector<MyClass*>& MyVector, int i) {
    MyClass c("", i);
    MyVector.push_back(&c);
}

int main() {
    addInstance(MyVector, 1);
    addInstance(MyVector, 2);
    // ...
 }
class-MyClass{
// ...
};
void addInstance(std::vector和MyVector,int i){
MyClass c(“,i”);
MyVector.push_back(&c);
}
int main(){
加恒量(MyVector,1);
加恒量(MyVector,2);
// ...
}
下面是一个工作示例来演示这个问题,它确实输出了“2,2”(尽管这并不能保证,因为您正在调用未定义的行为):

编辑:我的灵力说“函数中的自动变量”(现在我们有了最新的问题)实际上是“循环中的自动变量”。错得不太远。:-)

您存储的自动变量地址超过了其生存期,这是不允许的。每次调用都会重复使用该地址,因此存储的每个指针都是相同的,并且恰好指向上次用于存储最近创建的MyClass实例的内存(尽管这不能保证)

您需要(最好)存储这些自动变量的副本,而不是指向它们的指针,或者(不太好)使用
new
创建它们,然后使用
delete
删除它们


要存储副本,需要使用
std::vector
。下面是一个如何实现的示例:请注意,一旦您的类变得更复杂,您可能需要定义一个复制构造函数、析构函数和赋值运算符—请查阅“三个规则”。如果您使用的是C++11,请同时查找“五法则”。

您发布的任何内容都不会导致此问题。请检查向量中指针给出的实际地址。你是不是两次得到了相同的地址,还是第一个对象变成了第二个对象的副本?指针指向的对象可能在指针之前就死了。发布一些复制问题的最小且完整的代码。您发布的代码工作得非常好-这里是ideone:您的问题在其他地方。@user3794186:除非您有充分的理由,否则您应该只使用
std::vector
,而不是指针向量。谢谢!但是,您的工作示例是否也产生了错误的输出。。?它是否应该输出1,2而不是2,2?@user3794186:第一个示例演示了问题,而不是解决方案。答案已更新。
class MyClass {
    // ...
};

void addInstance(std::vector<MyClass*>& MyVector, int i) {
    MyClass c("", i);
    MyVector.push_back(&c);
}

int main() {
    addInstance(MyVector, 1);
    addInstance(MyVector, 2);
    // ...
 }