gpt4 book ai didi

c++ - 数组内容在运行时随机改变

转载 作者:行者123 更新时间:2023-11-28 06:46:05 25 4
gpt4 key购买 nike

我有一个名为 SolidObject 的类,它包含各种指针,指向第一个数组元素:

// Member declaration and definition pulled together from .cpp and .h
class SolidObject {
//I will only use one variable as demonstration, the others behave the same
protected:
float* vertices;
public:
SolidObject(float[] vertices) {
this->vertices = vertices;
}
}

对于实验,我曾经将硬编码数组传递给构造函数,例如

float vertices[] {
-5,0,-5,
5,0,-5,
-5,10,-5,
-5,0,5,
5,10,-5,
5,0,5,
-5,10,5,
5,10,5
};
SolidObject cube (vertices);

现在我将 Stanford PLY 文件中的值解析为 std::vector,然后将其传递给构造函数:

std::vector<float> vertices;
for (...) {
vertices.push_back(....);
}
SolidObject cube (&vertices[0]);

使用此方法,cube->vertices 中指向的值会在运行时无故更改。这是 watch coinObject->vertices[0] 的 GDB 观察点输出:

这是 WP 第一次被触发。这是有意为之的,因为当使用默认 (void) 构造函数时,vertices 是 NULL 指针。 coinObject 首先被定义,然后被初始化,所以这种行为是意料之中的。

Hardware watchpoint 1: coinObject->vertices[0]

Old value = <unreadable>
New value = 0.100000001
0x0000000000409c69 in gameloop (screen=0x689cc0, font=0x84a020)
at ../gameloop.cpp:386
386 coinObject = SolidObject::fromFile("/home/sebastian/coin.ply");
(gdb) c
Continuing.

现在是我无法向自己解释的事情:

Hardware watchpoint 1: coinObject->vertices[0]

Old value = 0.100000001
New value = 0
0x0000003852c8d4b1 in memset () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) c
Continuing.
Hardware watchpoint 1: coinObject->vertices[0]

Old value = 0
New value = 1.40129846e-45
0x00007ffff63df548 in ?? () from /usr/lib/x86_64-linux-gnu/dri/r600_dri.so
(gdb) c
Continuing.

这一次它在这两个变化之后停止了,在 coinObject->vertices[0] 中有数千次变化。有时程序甚至会在第一次或第二次更改后崩溃,因为使用这些数组的 OpenGL 无法从 224 个顶点中找到第 100 万个顶点。(我为 glDrawElements 使用索引数组,但这并不重要对于我的问题...)

谁能解释为什么会发生这种情况以及如何解决?

最佳答案

如果您使用 vector,您的代码会更安全在你的对象中:

class SolidObject
{
std::vector<float> vertices;
public:
SolidObject(const std::vector<float>& original_vertices)
: vertics(original_vertices)
{
}
};

如果您的 vector你传递给你的版本SolidObject一旦调整大小,您指向 float 的指针将不再有效并指向垃圾。

另外,为什么要使用 float 来降低精度?而不是 double

如果你想要SolidObject要使用相同的 vector ,您可以使用引用作为数据成员:

class SolidObject
{
std::vector<float>& vertices;
public:
SolidObject(std::vector<float>& v)
: vertices(v)
{
// Look, no "this" pointer. :-)
}
};

关于c++ - 数组内容在运行时随机改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24963008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com