结构向量的值发生意外变化
Value of vector of structures changes unexpectedly
我有一个奇怪的问题。有一个结构向量。对于临时结构,我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
)。由于代码重用了名为temp_face
的Face
的相同实例,向量中的所有Face
实例face
指向同一个Face.cnt.dim
数组(因为faces
将包含temp_face
的副本)。
我看不出有任何理由在Vector
内部动态分配数组,因为它是固定大小的。建议改为:
struct Vector
{
float dim[3];
};
或者你需要实现复制构造函数、赋值运算符和析构函数来Vector
。看看什么是三法则?了解更多信息。
相关文章:
- 在C++中对T*类型执行std::move的意外行为
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 处理除以零会导致<csignal>意外行为
- vscode下的Arduino代码出现意外编译错误
- 使用++运算符会导致意外的结果
- 套接字读取后,我在缓冲区中看到意外输入
- 为什么cudaMemGetInfo报告设备内存总量的变化
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 使用vscode调试时,GDB意外退出
- 如何避免LED在循环状态变化中闪烁?
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 尝试将字符串/字符转换为整数会产生意外结果
- 当 I2C 值在C++中发生变化时收到通知
- 声明双重给它一个值0,但打印结果意外变化
- c ++,数组的值在某处意外变化,你能帮我找出在哪里吗?
- 结构向量的值发生意外变化
- OpenCV Trackbar回调函数和意外的状态变化
- 为什么会发生这种意外的变量变化