所以我的主要功能
中有这个代码if(mesType == 1) {
cin.ignore();
Message mes1;
stack1.push(&mes1);
} else if(mesType == 2) {
cin.ignore();
MorseCodeMessage mes2;
stack1.push(&mes2);
}
这是函数
void MessageStack::push(Message *ms1) {
messages.push_back(ms1);
}
消息在哪里
vector <Message*> messages;
你能解释一下为什么我的消息向量中的所有元素都被我推送的内容替换了吗?
答案 0 :(得分:1)
您正在推送指向局部变量的指针,这很可能会产生未定义的行为;如果本地对象没有超出范围,则有可能重复推送同一对象的地址(局部变量)。请注意,局部变量的内容将更改,并且所有先前推送的地址仍指向同一对象。
答案 1 :(得分:1)
每次推送后,您都会推送指向超出范围的局部变量。随着时间的推移,堆栈空间会被重用,所以你最终会得到指向同一堆栈内存的多个指针,但是向量中的指针在技术上悬空并使用它们是未定义的行为。
由于您显然具有派生自new
的多态类,因此您需要使用if(mesType == 1) {
cin.ignore();
Message *mes1 = new Message;
stack1.push(mes1);
} else if(mesType == 2) {
cin.ignore();
MorseCodeMessage *mes2 = new MorseCodeMessage;
stack1.push(mes2);
}
动态分配它们,以便它们在存储在向量中时保持活动状态:
Message
不要忘记使用虚拟析构函数定义delete
,然后在完成向量或从向量中删除项目时,在每个指针上调用std::unique_ptr
。否则你会有内存泄漏。
在C ++ 11及更高版本中,更安全的解决方案是使用std::vector<std::unique_ptr<Message>> messages;
void MessageStack::push(std::unique_ptr<Message> ms1) {
messages.push_back(std::move(ms1));
}
...
if(mesType == 1) {
cin.ignore();
stack1.push(std::unique_ptr<Message>(new Message));
// or, in C++14 and later:
//stack1.push(std::make_unique<Message>());
} else if(mesType == 2) {
cin.ignore();
stack1.push(std::unique_ptr<Message>(new MorseCodeMessage));
// or, in C++14 and later:
//stack1.push(std::make_unique<MorseCodeMessage>());
}
而不是原始指针:
{{1}}