快速提问伙计们,我有以下问题:
我的代码中有一个对象(结构(指针,当我修改某些内容时,为了跟踪其历史记录,我将其保存在对象的向量(堆栈(中。所以我正在努力。
{
Object* myObject;
vector<Object> stack;
stuffHappensInObject(*myObject);
stack.push_back(myObject);
if(IclickLoadLast){
myObject = stack.at(size-1);
}
}
我在push_back
调用时遇到问题,我不知道是否可以将新对象中的所有结构变量放入堆栈中。我该怎么做?
首先不要使用指针,这里不需要。该问题是由于您尝试向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
。
几个问题:
这将不起作用:
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.