快问问题,我有以下问题:
我的代码中有一个Object(struct)指针,当我修改某些内容时,为了跟踪它的历史记录,我将它保存在Objects的向量(堆栈)中。 所以我想做。
{
Object* myObject;
vector<Object> stack;
stuffHappensInObject(*myObject);
stack.push_back(myObject);
if(IclickLoadLast){
myObject = stack.at(size-1);
}
}
我遇到了push_back
调用的问题,我不知道是否有可能将新Object中的所有struct变量都放入堆栈中。我怎么能这样做?
答案 0 :(得分:1)
首先不要使用指针,这里不需要。问题是由于您尝试将Object*
添加到Object
的向量(更不用说取消引用未初始化指针时的UB-land快速票)。这是固定代码:
{
Object myObject;
std::vector<Object> stack;
stuffHappensInObject(myObject);
stack.push_back(myObject);
if(IclickLoadLast){
myObject = stack.at(stack.size() - 1);
}
}
我还将size
更改为stack.size()
,这是您可以使用的std::vector
的有效方法。另外,请查看std::stack
,它提供了更多类似堆栈的操作:
{
Object myObject;
std::stack stack;
stuffHappensInObject(myObject);
stack.push(myObject);
if(IclickLoadLast){
myObject = stack.top();
}
}
在这两种情况下,如果您使用的是C ++ 11,我建议您使用std::vector::emplace_back
或std::stack::emplace
代替push_back
和push
。
答案 1 :(得分:1)
几个问题:
这不起作用:
stack.push_back(myObject);
因为myObject
的类型为Object*
,而堆栈则采用Object
类型的对象。请注意类型的细微差别。我不确定你为什么甚至使用指针(没有足够的上下文)。
但还有另一个主要问题:
在这里你取消引用一个未初始化的指针。结果是未定义的行为。
Object* myObject; // No value defined (so it is random)
stuffHappensInObject(*myObject); // De-referencing (the *) on an uninitialized pointer.