2016-10-09 68 views
0

我有两个类:spotframe指针不指向指向类的向量中的正确位置

spot保持数据有关由一些图像处理器检测到的点:它只有一个id(INT),其是唯一的,并且xy坐标 - (均为双)。我将所有的点存储在一个向量中,我称之为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,但在0x210d080在向量spots

由于存在随机垃圾数据和地址不一样,我很确定我没有正确地做到这一点 - 但我不明白我应该采取什么不同的做法。我将不胜感激任何帮助。

+0

请提供[mcve]。 – Barry

+0

为什么你先在堆上分配,然后复制并存储它,然后删除原来的? – stijn

+0

如果由于添加了更多元素而需要重新分配矢量,则可以使用矢量的back元素'&spots.back()'的地址,但该地址**会更改**。只要你调用'push_back',你所有到它的元素的指针就会失效*。 – Galik

回答

0
spots.push_back(*S); 

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

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