C++ 在大表中生成随机数会导致崩溃

C++ 在大表中生成随机数会导致崩溃,c++,arrays,random,crash,mingw,C++,Arrays,Random,Crash,Mingw,我需要为一个非常简单的程序生成一个大表中的随机数,它不断崩溃(这个程序已经停止工作,windows正在寻找解决方案等等),我设法将它与下面的代码隔离。如果tableSizeY为103或更低,则运行正常,但104或更高会导致我的计算机崩溃。据我所知,只有第一行被随机数填满,其他所有的都是空的,所以我觉得很奇怪 我在Windows8.1上使用的是MingW4.9.1 inside Sublime Text 2,8go ram,如果这与此有关的话 而且,对编程来说是完全陌生的,所以很明显,我可能忽略了

我需要为一个非常简单的程序生成一个大表中的随机数,它不断崩溃(这个程序已经停止工作,windows正在寻找解决方案等等),我设法将它与下面的代码隔离。如果tableSizeY为103或更低,则运行正常,但104或更高会导致我的计算机崩溃。据我所知,只有第一行被随机数填满,其他所有的都是空的,所以我觉得很奇怪

我在Windows8.1上使用的是MingW4.9.1 inside Sublime Text 2,8go ram,如果这与此有关的话

而且,对编程来说是完全陌生的,所以很明显,我可能忽略了一些非常琐碎的事情

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main ()
{
        int const tableSizeX (5000);
        int const tableSizeY (104);
        int table[tableSizeX][tableSizeY];
        //Launch rand generator
        srand(time(NULL));

        for (int i; i<tableSizeX; ++i)
        {
                table[i][0] = rand() % 10 + 1;
                cout << i+1 << " = " << table[i][0] << endl;
        }

        getchar();
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
int const tableSizeX(5000);
int const tableSizeY(104);
int table[tableSizeX][tableSizeY];
//启动兰德发电机
srand(时间(空));

对于(int i;i ),您在堆栈上分配大量数据。请考虑:


作为一个肮脏的快速修复,您还可以将
设置为全局变量。

默认编译器堆栈限制为1MB。请尝试改用动态内存。这将允许您的程序运行时不会出现任何问题


使用new关键字将内存分配到堆上,在这种情况下,只要确保在使用完内存后调用delete[]即可。

您可能超过了程序的默认堆栈大小。。。 你可以用

gcc -Wl,--stack,N
其中N是所需的堆栈大小(以字节为单位)。。 假设sizeof(int)为您提供4个字节,您将需要超过4*104*5000个字节

另一种方法是动态分配所需的内存:

std::vector<std::vector<int>> table(tableSizeX,std::vector<int>(tableSizeY));
std::vector表(tableSizeX,std::vector(tableSizeY));

很可能您耗尽了堆栈中分配给您的内存,请尝试在堆中分配它

你有很多选择

1) 您可以使用指针-问题是您必须在程序退出之前手动删除它,否则将导致内存泄漏

2) auto_ptr-就像指针一样,但当它超出范围时,它实际上会删除自身(这意味着当您在函数调用之后传递函数的指针时,因为它已经超出范围,它会自动删除自身)

3) shared_ptr——很难解释这一点,但实际上它的工作原理与auto_ptr类似,只是当它超出作用域时不会自动删除自己,它有一个控制块,当它传递给另一个函数或某种类型的另一个作用域时,控制块会递增,当该实例超出作用域时,控制块会递减t当计数器达到零时,请自行选择


您的调用.shared_ptr在您学会如何使用它后,效果非常好。

您很可能在这一行出现堆栈溢出
int table[tableSizeX][tableSizeY];
。您的操作系统可能没有为您的进程提供足够的堆栈来容纳如此大的对象…尝试使用
new
动态分配它,或者(更好)使用
std::vector
,或者检查如何请求更多堆栈。您有权访问Boost(www.Boost.org)吗?我知道这对初学者来说是一个飞跃,但他们确实有一个非常好的矩阵库。如果没有,请告诉我,因为您可以采取另一种方法。顺便说一下,取
rand()的模
从统计学上讲是一个坏主意,因为它引入了偏差,除非生成器的周期是10的倍数。在您的情况下,您可以使用
auto
unique\u ptr
(智能指针)当然可以。但是智能指针可能更像是一个高级主题…@dragosht:现代的共识是,
delete
是一个高级主题,因为很难在所有情况下都正确。在什么编译器上?虽然这本身不是一个坏建议,但这并不是最好的实践。在C++中,我们通常使用“代码> STD::vector < /Cord>”或一个适当的容器。默认堆栈限制是大多数编译器的1MB。我个人使用Visual Studio,在这里也是如此。在使用向量与2D数组的情况下,在这种情况下都不是更好的,因为我们不知道用户除了存储R之外还想得到什么。andom数字。要真正找到最好的容器,我们需要知道数据的目的是什么,并分析内存与速度的关系,因为对于这样大小的数据集,使用图形、哈希表、二进制搜索树等…可能比仅仅使用向量或2D数组更有效。@user3851179:AFAIK Linux上的默认值是64K左右,但堆栈增长也会更有效但情况不同。
gcc -Wl,--stack,N
std::vector<std::vector<int>> table(tableSizeX,std::vector<int>(tableSizeY));