0

我有一个小程序,用 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 是一个静态变量,我必须调用一个静态函数来设置它,一切都很好。但是尝试将其转换为构造函数,尽我所能,我所有的尝试都失败了。

那么我在这里做错了什么?

4

3 回答 3

3

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

于 2013-02-28T13:42:46.803 回答
3

您班级中的此声明:

int myarray[45000000];

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

于 2013-02-28T13:43:53.003 回答
3

所以你大概在你的主要(或其他任何地方)这样做

int main ()
{
  Test t; // Hello StackOverflow
}

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

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

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

于 2013-02-28T13:46:06.803 回答