结构向量的值发生意外变化

Value of vector of structures changes unexpectedly

本文关键字:意外 变化 向量 结构      更新时间:2023-10-16

我有一个奇怪的问题。有一个结构向量。对于临时结构,我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

默认编译器生成的复制构造函数(和赋值运算符)用于VectorFace(但最重要的是Vector)。由于代码重用了名为temp_faceFace的相同实例,向量中的所有Face实例face指向同一个Face.cnt.dim数组(因为faces将包含temp_face的副本)。

我看不出有任何理由在Vector内部动态分配数组,因为它是固定大小的。建议改为:

struct Vector
{
    float dim[3];
};

或者你需要实现复制构造函数、赋值运算符和析构函数来Vector。看看什么是三法则?了解更多信息。