-1

快速提问,我有以下问题:

我的代码中有一个对象(结构)指针,当我修改某些东西时,为了跟踪它的历史,我将它保存在对象的向量(堆栈)中。所以我正在努力做。

{
   Object* myObject;
   vector<Object> stack;


   stuffHappensInObject(*myObject);
   stack.push_back(myObject);

   if(IclickLoadLast){
    myObject = stack.at(size-1);
   }
}

我的push_back调用有问题,我不知道是否可以将新对象中的所有结构变量都放入堆栈。我怎样才能做到这一点?

4

2 回答 2

1

首先不要使用指针,这里不需要。问题是由于您试图将 a 添加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_backorstd::stack::emplace而不是push_backand push

于 2013-12-18T00:50:59.270 回答
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.
于 2013-12-18T00:53:17.617 回答