ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 结构矢量值意外变化

2019-09-01 20:17:53  阅读:262  来源: 互联网

标签:c structure stdvector


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有