我有全局变量:
point4 * mypoints;
color4 * mycolors;
一段代码块,它是函数drawPlyFiles的一部分
vector<point4> retpolys;
retpolys.resize(polynum * 3);
GLint polyx, polyy, polyz;
for (int i = 0; i < polynum; i++)
{
inStream >> polyx;
inStream >> polyx >> polyy >> polyz;
//cout << "x: " << polyx << " y: " << polyy << " z: " << polyz << "\n";
retpolys[i*3] = retVerts[polyx];
retpolys[(i*3) + 1] = retVerts[polyy];
retpolys[(i*3) + 2] = retVerts[polyz];
//retpolys[i] = point4( polyx, polyy, polyz, 1.0 );
}
mypoints = &retpolys[0];
return true;
从代码中拿走的重要部分是我将全局mypoints(数组)设置为等于retpolys(vector)。 Retpolys填充了for循环中的数据。当我调试时,retpolys中的所有数据都很好并且正确。 (retVerts是point4的向量)
稍后在我的主init函数中运行:
drawPlyFile("ply_files/airplane.ply");
//colorcube();
point4 temp = mypoints[1];
int thissize = sizeof(mypoints)/sizeof(mypoints[0]);
for (int i = 0; i < thissize; i++)
{
mycolors[i] = color4( 0.0, 0.0, 0.0, 1.0 );
}
代码编译正常,但我有一个运行时异常。我调试以找到问题。我在drawPlyFiles之后检查mypoints的值,看起来它只包含一个指向retpolys开始位置的指针。但是,当我调试时,它不会让我查看数组的其他部分,只是第一个指针。(我可以在函数中看到retpolys的所有单独值)然后我检查这个大小的值和我得到一个像-12894161的数字,这没有意义,因为它应该是mypoints的大小。
我认为问题在于从retpolys到mypoints的转换,但我不知道如何修复它,或者即使这是错误的实际原因。有什么帮助吗?
P.S。我希望mycolors拥有与mypoints相同数量的元素,并且所有em都是color4(0.0,0.0,0.0,1.0)
答案 0 :(得分:2)
以下行不正确:
mypoints = &retpolys[0];
这里,您将指针指向退出函数时自动销毁的向量内容。向量析构函数将释放这段内存,使您的全局变量指向一个释放的内存空间。
您应该进行实际的内存分配并复制内容。
答案 1 :(得分:1)
你没有设置任何数组等于任何数组;你只是存储一个指向矢量第一个元素的指针;当向量超出范围时,这就不再有效。
的确,mypoints
不是数组。
为什么不保持矢量?当您需要指针(可能传递给第三方图形API)时,您可以在最后一刻执行此操作。
答案 2 :(得分:1)
在C ++中声明如下变量:
vector<point4> retpolys;
它的存储类是自动的。这意味着当范围变量在结尾声明时,用于保存内容的内存将自动释放(如果它是类,则调用析构函数)。在您的情况下,这意味着当drawPlyFiles函数结束时,将释放retpolys内容。你巧妙地通过返回指向向量中第一个值的指针来解决这个问题。但这不起作用 - 内容已被释放。即使它有时工作也是不正确的。
您真正想要做的是自己为retpolys分配内容。这不是让编译器根据范围设置内存,而是使用new运算符来分配它。例如:
vector<point4> *retpolys = new vector<point4>;
在引用retpolys时,您需要更改函数其余部分的语法。