为什么我的程序在构造函数中使用fread时崩溃了?

时间:2013-02-28 13:39:39

标签: c++ arrays crash fread

我有一个用C ++编写的小程序,它包含一个带有大数组的类。该课程如下:

class Test
{
public:
    Test();
    ...
private:
    int myarray[45000000];
};

现在,从文件中读入此数组。我想直接用构造函数来做这件事,而不是费心去调用任何额外的函数。该阵列只需要读入一次,之后就不会再改变了。它具有指定的确切大小。

我的构造函数如下所示:

Test()
{
   memset(myarray, 0, sizeof(myarray));
   FILE* fstr = fopen("myfile.dat", "rb");
   size_t success= fread(myarray, sizeof(myarray), 1, fstr);
   fclose(fstr);
}

使用Visual Studio 2012 Ultimate:当尝试启动使用此类的程序时,一旦创建类,它就会以“APPCRASH”崩溃,并且在尝试调试它时(我接下来不知道它) ),告诉我错误是堆栈溢出。

这一切的神秘之处在于,在我以前的版本中,myarray是一个静态变量,我不得不调用一个静态函数来设置它,一切都很顺利。但是尝试将其转换为构造函数,尽我所能,我所有的尝试都失败了。

那我在这里做错了什么?

3 个答案:

答案 0 :(得分:3)

即使您的int的最小大小为2个字节,您的阵列也会使用大约86MB的内存。典型的最大堆栈大小为1MB。如果在堆栈上分配了Test对象的存储空间,则很容易溢出。您需要动态分配数组或不立即将所有数据加载到内存中。更好的是,使用一个标准容器,为其元素使用动态分配,比如`std :: vector。

答案 1 :(得分:3)

班上的这个声明:

int myarray[45000000];

尝试为每个int(假设32位)= 180MB内存分配45,000,000 * 4个字节。你的堆栈无法支持它。您需要重新设计应用程序以更改加载文件的方式。

答案 2 :(得分:3)

所以你可能会在你的主要(或其他任何地方)

中这样做
int main ()
{
  Test t; // Hello StackOverflow
}

您需要的是在堆上分配它:

int main ()
{
  Test* t = new Test;
  delete t;
}

它没有因静态变量而崩溃,因为静态变量未在堆栈上分配