我有以下代码,带有一个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 ;
答案 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
时,这些指针变为无效(悬空)并且取消引用它们是未定义的。