1

我正在使用 3D 矢量,一切都很完美。当我添加并使用 ofstream 文件时,出现了分段错误。我根本不明白这个问题。以下代码不起作用:

#include <iostream>
#include <vector>
#include <fstream>

std::vector < std::vector < std::vector <float> > > hand;


int main(){

//First Part
std::ofstream file;
file.open("test.csv");
file << "Hello World!";
file.close();

//Second Part
hand.reserve(20);
for (int i=0; i<hand.capacity(); i++){
    hand[i].reserve(4);
}

return 0;
}

如果您评论其中一个部分,则代码将完美运行。当您想同时使用它们时,会出现分段错误。

同样重要的是要注意代码可以在以下情况下工作:

hand.reserve(20);

我们使用低于 8 的数字:

hand.reserve(7); //or lower

我的问题是:为什么当我同时使用它们时代码不起作用?我能做些什么来修复它?你对这个特殊情况有什么解释吗?

我必须在更大的代码中实现这一点,所以最好知道根本原因并在接下来的情况下避免它。

4

3 回答 3

5

改变

hand.reserve(20);

hand.resize(20);

reserve只会改变向量容量来存储数据,而不会创建任何实际对象。因此使用reserve你将得到仍然是空向量,它能够接受 20 个新值而无需重新分配。capacity()size()返回向量已经为其分配内存的元素数量不同,它可能大于size()返回的实际元素数量。

于 2013-04-24T08:02:12.447 回答
2

你不能hand[i].仅仅因为你已经为它们保留了空间就开始使用元素(即)......它们还没有被构造。您不仅应该使用它resize(20)来请求内存,而且还应该初始化 的元素hand,之后您可以reserveresize包含的容器......

于 2013-04-24T08:02:57.990 回答
1

reserve只会增加向量的容量,而不是它的实际大小。

然而,在你的循环中,当你hand[i]访问向量的项目时,就好像它实际上已经调整了大小一样,但实际上这些项目还不存在。因此出现了段错误。

您可能希望将第一个reserve调用替换为resize(可能还有其他后续reserve调用)。

于 2013-04-24T08:02:48.063 回答