将向量转换为数组问题
Posted
技术标签:
【中文标题】将向量转换为数组问题【英文标题】:converting vector to array problems 【发布时间】:2011-11-05 02:11:58 【问题描述】:我有全局变量:
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(array) 设置为等于 retpolys(vector)。 Retpolys 被来自 for 循环的数据填充。当我调试时,retpolys 中的所有数据都很好。 (retVerts 是point4的向量)
稍后在我的主初始化函数中运行:
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 的转换,但我不知道如何修复它,或者即使那是错误的实际原因。有什么帮助吗?
附言我希望 mycolors 具有与 mypoints 相同数量的元素,并且所有 em 都是 color4( 0.0, 0.0, 0.0, 1.0 )
【问题讨论】:
【参考方案1】:以下行不正确:
mypoints = &retpolys[0];
在这里,您将指针指向一个向量的内容,该向量在您退出函数时会自动销毁。矢量析构函数将释放这块内存,使您的全局变量指向一个已释放的内存空间。
您应该进行实际的内存分配并复制内容。
【讨论】:
我从***.com/questions/2923272/…得到了方法。但是你说的是向量在函数退出时被释放,所以指针不是向量的开始,而只是内存中一个没有意义的位置。你是什么意思进行实际的内存分配?你的意思是我应该让函数返回向量并在全局空间中进行转换? 你可以按照 Robin 上面的建议做,让“mypoints”成为一个实际的向量而不是指针。它将简化您的代码和内存管理:“std::vector你没有设置任何数组等于任何东西;你只是存储一个指向向量第一个元素的指针;当向量超出范围时,这将不再有效。
确实,mypoints
不是数组。
为什么不只保留矢量?当您需要一个指针(可能传递给第 3 方图形 API)时,您可以在最后一刻完成。
【讨论】:
【参考方案3】:在 C++ 中,当你像这样声明一个变量时:
vector<point4> retpolys;
它的存储类是自动的。这意味着当范围声明变量时,用于保存内容的内存会自动释放(如果它是一个类,则调用析构函数)。在您的情况下,这意味着当 drawPlyFiles 函数结束时, retpolys 内容被释放。您通过返回指向向量中第一个值的指针巧妙地解决了这个问题。但这行不通——内容已被释放。即使它有时有效,但它是不正确的。
您真正想做的是自己为 retpolys 分配内容。这不是让编译器根据范围设置内存,而是使用 new 运算符来分配它。例如:
vector<point4> *retpolys = new vector<point4>;
在引用 retpolys 时,您需要更改函数其余部分的语法。
【讨论】:
以上是关于将向量转换为数组问题的主要内容,如果未能解决你的问题,请参考以下文章