向量指针仅返回向量的最后一个值

时间:2011-10-23 06:35:53

标签: c++ pointers vector

我有以下代码,带有一个struct HE_face的向量和一个struct HE_edge的数组。根据一些测试我设置为面向量添加一个新面,并将每个前进边设置为添加到面向量的最后一个面。但是,由于某种原因,输出是所有边都被设置为添加到面向量的相同最终面 所以不是输出:

edge: 0 face: 0
edge: 1 face: 0
edge: 2 face: 0
edge: 3 face: 1
edge: 4 face: 1
edge: 5 face: 1

我得到了输出:

edge: 0 face: 1
edge: 1 face: 1
edge: 2 face: 1
edge: 3 face: 1
edge: 4 face: 1
edge: 5 face: 1

对于我所做错的任何建议都将不胜感激!

谢谢!

vector<HE_face> f_list ;
int size = 6 ;
HE_edge *edges[size] ;

struct HE_face
{
    HE_face( HE_edge* e, unsigned long i ) : edge(e), normal(NULL), index(i) {}
    HE_face( HE_edge* e, HE_normal* n, unsigned long i ) : edge(e), normal(n), index(i) {}

    unsigned long index ;

    HE_edge* edge ;
    HE_normal* normal ;
} ;

struct HE_edge
{
    HE_edge( HE_vertex* v, HE_edge* p, HE_face* f, HE_edge* n ) : vertex(v), pair(p), face(f), next(n) {}

    HE_edge* next ;
    HE_vertex* vertex ;
    HE_face* face ;
    HE_edge* pair ;
} ;

for( int i = 0 ; i < size ; i++ )      // create the edges
{
    if( i%3==0 )
         f_list.push_back( HE_face( edges[i], f_list.size() ) ) ;
    edges[i]->face = &f_list.back() ;       // set the face of the edge
}
for( int i = 0 ; i < size ; i++ )
    cout << "edge: " << i << " face: " << edges[i]->face->index << endl ;

2 个答案:

答案 0 :(得分:2)

您获取f_list元素的地址,该地址随后被push_back()无效。

引用我最喜欢的非官方参考资料:

  

这有效地将向量大小增加1,如果向量大小等于调用之前的向量容量,则会导致内部分配存储的重新分配。重新分配使以前获得的所有迭代器,引用和指针无效。 - http://www.cplusplus.com/reference/stl/vector/push_back/

答案 1 :(得分:0)

当您说edges[i]->face = &f_list.back() ;时,您将指针存储到向量内部数据中,该指针仅在下一次修改向量的调用之前有效。因此,当您下次调用push_back时,这些指针变为无效(悬空)并且取消引用它们是未定义的。