【发布时间】:2016-10-09 18:46:11
【问题描述】:
我有两个班级:spot 和 frame。
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 中,但位于矢量 spots 的 0x210d080 处。 p>
由于存在随机垃圾数据并且地址不一样,我很确定我没有正确执行此操作 - 但我不明白我应该做些什么不同的事情。我将不胜感激。
【问题讨论】:
-
为什么要先在堆上分配,然后复制存起来,再删除原来的?
-
您获取向量后面元素的地址
&spots.back(),但是如果向量需要重新分配,因为您添加了更多元素,该地址会更改。一旦您调用push_back,您指向其元素的所有指针都无效。 -
如果您希望
spots在添加到其末端时为其元素提供稳定的地址,那么您可以改用std::deque。 -
当
vector <spot *> spots_list ;是向量声明时,spots.push_back (*S) ;是如何工作的?
标签: c++ class pointers vector new-operator