c – 结构矢量值意外变化
作者:互联网
我有一个奇怪的问题.有一个结构向量.使用临时结构,我push_back到结构向量.但是当我检查第一个成员的cnt时,我发现它变了.任何的想法? (下面的代码是简化版,但代表性的一个)
struct Vector
{
float *dim;
Vector ()
{
dim = new float [3];
}
};
struct Face
{
float an_N, an_P;
int P, N;
Vector Af;
float Ad;
Vector cnt;
float ifac;
float mf;
};
std::vector <Face> face;
Face temp_face;
for (;;)
{
temp_face.cnt.dim[0] = 0.f;
temp_face.cnt.dim[1] = 0.f;
temp_face.cnt.dim[2] = 0.f;
for (int q=0; q<n_vtx_2D; ++q)
{
temp_face.cnt = temp_face.cnt + pt[vtx[q]] / n_vtx_2D;
}
face.push_back(temp_face);
}
std::cout << face[0].cnt.dim[0] << std::endl;
产量
0.25
0
解决方法:
默认编译器生成的复制构造函数(和赋值运算符)正用于Vector和Face(但最重要的是Vector).当代码重新使用Face的同一个实例,名为temp_face时,矢量face中Face的所有实例都指向同一个Face.cnt.dim数组(因为faces将包含temp_face的副本).
我看不出在Vector中动态分配数组的任何原因,因为它是固定大小.建议改为:
struct Vector
{
float dim[3];
};
或者您需要为Vector实现复制构造函数,赋值运算符和析构函数.
有关更多信息,请参见What is The Rule of Three?.
标签:c,structure,stdvector 来源: https://codeday.me/bug/20190901/1785569.html