C++ 向量元素被最后一次调用push_back替换
C++ Vector elements being replaced by last call to push_back
所以我的主函数中有这段代码
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;
你能解释一下为什么我的消息向量中的所有元素都被我最后推送的任何元素所取代吗?
你正在推送指向局部变量的指针,这很可能会产生未定义的行为;如果局部对象没有超出范围,你有机会重复推送同一对象(局部变量)的地址。请注意,局部变量的内容将更改,并且所有先前推送的地址仍指向同一对象。
您正在推送指向局部变量的指针,这些变量在每次推送后都会超出范围。 堆栈空间会随着时间的推移而重复使用,因此您最终可能会得到指向同一堆栈内存的多个指针,但向量中的指针在技术上是悬而未决的,使用它们是未定义的行为。
由于您显然具有派生自Message
的多态类,因此您需要使用 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
。 否则,您将有内存泄漏。
在 C++11 及更高版本中,更安全的解决方案是使用 std::unique_ptr
而不是原始指针:
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>());
}
相关文章:
- 推导 std::vector::back() 的返回类型
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- vector.push_back(vector.back()+1) 是未定义的行为吗?
- C++自己的对象堆栈.在 push() 上复制了什么?
- C++ push() 和 pop() 方法使用指针的动态 LinkedList 的问题
- 如何像在javascript中一样"push" c ++映射
- 线路抑制状态错误 C4703 可能未初始化的局部指针变量"back"已使用
- std::vector using back(), pop_back(), push_back(), 得到'double free or corruption'错误
- vector.back()和vector.end()有什么区别
- 列表大小为 1,但 front() 和 back() 不相等
- 返回C++中没有 back() 方法的容器的最后一个元素?
- 在非空 std::list 上使用 std::list.back<int>() 时"Segmentation Fault"
- 模板堆栈类的复制构造函数中的 pop() 和 push() 不起作用
- 我们可以使用Back() - 值索引在其上执行向量插入
- 当我运行以下代码添加str.front() str.back时,它给了我200个,但为什么
- push(ing)back在循环中对象指针
- 在 C++ 中将元素添加到空向量:为什么 push.back 有效而 [] 无效
- 我似乎无法让 v.push.back() 处理字符串
- String::push_back() does not push back
- 向量resize(), push.back(), reserve()方法