矢量的对象有指针的对象

时间:2013-12-18 00:44:51

标签: c++ c vector structure pointer-to-array

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

我的代码中有一个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变量都放入堆栈中。我怎么能这样做?

2 个答案:

答案 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_backstd::stack::emplace代替push_backpush

答案 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.