【问题标题】:Pointers don't point to the right place in a vector of pointers to a class指针不指向指向类的指针向量中的正确位置
【发布时间】:2016-10-09 18:46:11
【问题描述】:

我有两个班级:spotframe

spot 保存有关某个图像处理器检测到的点的数据:它只有一个唯一的 id (int) 和 x,y-coordinates(都是双精度)。我将所有点存储在我称为spots 的向量中。

frame 拥有一个指向所有属于它的点的指针向量:

class frame
{
    int num ;
    vector <spot *> spots_list ;
    // other members and functions
}

我从文件中读取数据:

while (//goes through a lot of rows)
    {
        spot* S = new spot (ID, X, Y) ;
        spots.push_back (*S)  ;
        frames[i].spot_list.push_back (&spots.back()) ;
        delete S ;
    }

本质上,我正在创建一个新实例S,然后将其数据添加到向量spots,并将指向其地址的指针添加到框架的spot_list。 (至少,这是我想做的)

当我尝试打印帧中的所有点时,其中一些包含垃圾数据:例如id=423784237, id=-9431101 - 其余的都有有效数据。

但是,当我直接检查向量spots 时,它并没有指向正确的位置。 例如,id=37 位于框架 spot_list 的单元格 0x20f8288 中,但位于矢量 spots0x210d080 处。 p>

由于存在随机垃圾数据并且地址不一样,我很确定我没有正确执行此操作 - 但我不明白我应该做些什么不同的事情。我将不胜感激。

【问题讨论】:

  • 为什么要先在堆上分配,然后复制存起来,再删除原来的?
  • 您获取向量后面元素的地址&amp;spots.back(),但是如果向量需要重新分配,因为您添加了更多元素,该地址会更改。一旦您调用push_back,您指向其元素的所有指针都无效
  • 如果您希望spots 在添加到其末端时为其元素提供稳定的地址,那么您可以改用std::deque
  • vector &lt;spot *&gt; spots_list ; 是向量声明时,spots.push_back (*S) ; 是如何工作的?

标签: c++ class pointers vector new-operator


【解决方案1】:
spots.push_back(*S);

此调用有时需要重新分配spots 内的存储空间;发生这种情况时,任何先前存储的地址都将变为无效,因此spots_list 中的条目将变为虚假。

如果您知道向量的大小,您可以使用spots.reserve(size) 预先分配spots 的内部;否则,您可以将索引而不是指针存储到向量中。

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    相关资源
    最近更新 更多