我有一个用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是一个静态变量,我不得不调用一个静态函数来设置它,一切都很顺利。但是尝试将其转换为构造函数,尽我所能,我所有的尝试都失败了。
那我在这里做错了什么?
答案 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;
}
它没有因静态变量而崩溃,因为静态变量未在堆栈上分配