【问题标题】:C++ Segmentation fault when working with <vector> and <fstream>使用 <vector> 和 <fstream> 时出现 C++ 分段错误
【发布时间】:2013-04-24 08:00:35
【问题描述】:

我正在使用 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

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

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

【问题讨论】:

  • 您是否调试过您的应用程序并寻找任何 0 值?

标签: c++ vector segmentation-fault fstream ostream


【解决方案1】:

改变

hand.reserve(20);

hand.resize(20);

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-27
        • 2020-05-29
        • 1970-01-01
        • 1970-01-01
        • 2020-08-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多