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

时间:2014-08-08 06:56:35

标签: c++ arrays random crash mingw

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

我在Windows 8.1,8go ram上使用Sublime Text 2中的MinGW 4.9.1,如果这与它有任何关系。

另外,编程是全新的,所以我可能会忽略一些非常微不足道的事情,显然。

#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();
}

4 个答案:

答案 0 :(得分:1)

您在堆栈上分配大量数据。考虑一下dynamically allocating

int const tableSizeX (5000);
int const tableSizeY (104);

int **table;
table = new int*[tableSizeX];
for (int i = 0; i < tableSizeX; i++) {
    table[i] = new int[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;
}

// Now you also need to free the memory ...
for (int i = 0; i < tableSizeX; i++) {
    delete[] table[i];
}
delete[] table;

getchar();

更常见的C ++替代方法是使用std::vector,它可以让你摆脱所有更具C语言的指针魔法......

std::vector< std::vector<int> > table;

作为一种肮脏的快速修复,您还可以使table成为全局变量。

答案 1 :(得分:1)

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

gcc -Wl,--stack,N

其中N是所需的堆栈大小(以字节为单位).. 假设sizeof(int)给你4 - 你需要超过4 * 104 * 5000字节。

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

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

答案 2 :(得分:0)

默认编译器堆栈限制为1MB。尝试使用动态内存。这应该允许您的程序运行没有任何打嗝。

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

答案 3 :(得分:0)

很可能你耗尽了堆栈中为你分配的内存,尝试在堆中分配它。

您有很多选择可供选择。

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

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

3)boost :: shared_ptr - 很难解释这个但实际上就像auto_ptr一样,除了当它超出范围时它不会自动删除自身,它有一个控制块,当它和& #39;传递给另一个函数或某种另一个范围然后在该实例超出范围时递减。它只在计数器达到零时自行删除。

你的电话。一旦你学会了如何使用它,shared_ptr就像一个魅力。