指向vector的指针只返回vector的最后一个值

Pointers to vector returns only last value of vector

本文关键字:vector 最后一个 返回 指针 指向      更新时间:2023-10-16

我得到了以下代码,具有结构体HE_face的矢量和结构体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 ;

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

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

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

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