访问冲突堆栈溢出C ++

时间:2018-10-28 16:08:55

标签: c++ stack overflow

每个人...

我是C ++的新手... 我的问题是关于在C ++ Visual Studio 2012中读取大文本文件...

这是我的简单代码:

#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;

int main() {
    double x;
    int i,j;
    ifstream inFile;
    i=0;
    j=0;



 double x_array[800050][1] ;

    x = 0;
    inFile.open("D:\\a.txt");
    if (!inFile) {
        cout << "Unable to open file";
        exit(1); // terminate with error
    }

    while (inFile >> x) {

                         x_array[i][0]=x;
                         i++;

    }

    inFile.close();
    return 0;
}

但是当我调试代码时,遇到此错误:

textreader.exe中0x01242327的未处理异常:0xC00000FD:堆栈溢出(参数:0x00000000,0x00E42000)。

当我减小输入文本文件的大小(减小输入数量)时,问题就解决了...但是我需要整个输入文本文件...

我该怎么办?问题出在代码中还是我应该找到更好的方法?

2 个答案:

答案 0 :(得分:2)

通常将自动变量放在调用堆栈中。在大多数台式机系统上,调用堆栈的默认大小为1到几兆字节。 double [800050][1]的大小超过6兆字节(假设double的大小为8字节)。如您所见,使用如此巨大的自动变量的结果会导致堆栈溢出

请勿对大型对象使用自动变量。您可以改为动态分配对象。在这种情况下,您可以使用std::vector<double>

另一个问题是,您已经对数组的大小进行了硬编码,因此即使数组确实适合堆栈,也有使数组溢出的风险。使用std::vector时,可以让它动态增长,而不必对大小进行硬编码。

答案 1 :(得分:0)

您(如错误所述)在分配时发生堆栈溢出:

  double x_array[800050][1] ;

您应该尝试在堆上分配它(直接使用new或间接使用std :: vector这样的std容器)