C++:大的多维向量导致段错误

Posted

技术标签:

【中文标题】C++:大的多维向量导致段错误【英文标题】:C++: Large multidimensional vector causes seg fault 【发布时间】:2012-10-18 00:15:38 【问题描述】:

我有一个包含数字网格的大文件 (50x11k)。我要做的就是将这些值放入一个向量中,以便我可以同时访问不同行的值。我每次都会遇到段错误(我什至不能在 while 循环之前做一个 cout)。有人看到这个问题吗?

如果有更简单的方法,请告诉我。它是一个大文件,我需要能够将一行的值与另一行的值进行比较,因此简单的 getline 不起作用,有没有办法跳过文件而不是“抓住”行,而只是“检查”行,以便我以后可以通过输入该数字返回检查同一行?像看一个大数组一样的文件?我想同时查看第三行和该行中的 5 个字符,同时查看第 56 行和第 9 个字符,类似的东西。

#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

//int g_Max = 0;

int main() 

    vector<vector<string> > grid;

    ifstream in("grid.txt");
    int row = 0;
    int column = 0;
    string c;

    if (!in) 
        cout << "NO!";
    

    while (!in.eof()) 
        c = in.get();
        if ( c.compare("\n") == 0) 
            row++;
            column = 0;
        
        else 
            c = grid[column][row];
            cout << grid[column][row];
            column++;
        
    

    return 0;

【问题讨论】:

在尝试访问其元素之前,您尚未调整矢量的大小 无论何时你说.eof(),都可能是错的。 如果你有一个数字网格,为什么要使用字符串?作为参考,500000 长积分大约是 380 万兆字节,这并不多。 可以全部放入vector,解析可能需要一些时间 网格中也没有任何内容供您在 cout 之前分配 c 【参考方案1】:
    vector<vector<string> > grid;

这声明了一个空向量,没有元素。

        c = grid[column][row];

这会访问向量的元素,但没有元素。

如果您将其更改为使用 vector::at() 而不是 vector::operator[],如下所示:

        c = grid.at(column).at(row);

然后你会得到异常,告诉你访问超出范围。

您需要先用元素填充向量,然后才能访问它们。一种方法是预先用正确数量的元素声明它:

    vector<vector<string> > grid(11000, std::vector<string>(50));

您可能还想修复您的 IO 循环,测试 !in.eof() 通常是错误的。为什么不一次读取一行并将行拆分,而不是读取单个字符?

while (getline(in, c))

【讨论】:

非常感谢您的回答!【参考方案2】:

如果您只需要一次访问所有行,为什么不将其声明为std::vector&lt;std::string&gt; 而每行都是string??

std::string s;
std::vector<std::string> lines;
while( std::getline(in, s) ) lines.push_back( s );
std::cout << "File contain " << lines.size() << " line" << std::endl;
std::cout << "Char at [1][2] is " << lines[1][2] << std::endl; // assume [1][2] is valid!

【讨论】:

以上是关于C++:大的多维向量导致段错误的主要内容,如果未能解决你的问题,请参考以下文章

C++ 为啥在向量段错误中放置对象?

c++ 类向量中的段错误

超过向量不会导致段错误

为啥 C++ 标准向量在分配或调整大小时会出现段错误? [关闭]

在 C++ 中使用向量时出现分段错误

C++:当我添加看似无关的代码行时,分段错误消失了