C ++大型向量/数组的未处理异常

时间:2015-09-30 11:57:31

标签: c++ arrays

我一直在我的代码中得到一个未处理的异常,这让我很难过。

我确信这是我声明变量的方式。

基本上我试图创建3个数组,M行,N列随机变量。 如果我设置我的N = 1,000和M = 10,000,那不是问题。 如果我然后更改M = 100,000,则会出现未处理的异常内存分配错误。

有人可以帮助我理解为什么会这样。

部分代码是在VS2010上编写的。我现在已经转到了VS2013,所以关于使用更新功能的任何其他建议也将受到赞赏。 欢呼声,

#include <cmath>
#include <iostream>
#include <random>
#include <vector>
#include <ctime>
#include <ratio>
#include <chrono>
int main()
{
    using namespace std::chrono;

    steady_clock::time_point Start_Time = steady_clock::now();

    unsigned int N; // Number of time Steps in a simulation
    unsigned long int M; // Number of simulations (paths)

    N = 1000;
    M = 10000;
// Random Number generation setup 
    double RANDOM;
    srand((unsigned int)time(NULL)); // Generator loop reset

    std::default_random_engine generator(rand()); // Seed with RAND()

    std::normal_distribution<double> distribution(0.0, 1.0); // Mean = 0.0, Variance = 1.0 ie Normal

    std::vector<std::vector<double>> RandomVar_A(M, std::vector<double>(N)); // dw
    std::vector<std::vector<double>> RandomVar_B(M, std::vector<double>(N)); // uncorrelated dz
    std::vector<std::vector<double>> RandomVar_C(M, std::vector<double>(N)); // dz

// Generate random variables for dw
    for (unsigned long int i = 0; i < M; i++)
        {
        for (unsigned int j = 0; j < N; j++)
            {
                RANDOM = distribution(generator);
                RandomVar_A[i][j] = RANDOM;
            }
        }
// Generate random variables for uncorrelated dz
    for (unsigned long int i = 0; i < M; i++)
        {
        for (unsigned int j = 0; j < N; j++)
            {
                RANDOM = distribution(generator);
                RandomVar_B[i][j] = RANDOM;
            }
        }
// Generate random variables for dz
    for (unsigned long int i = 0; i < M; i++)
        {
        for (unsigned int j = 0; j < N; j++)
            {
                RANDOM = distribution(generator);
                RandomVar_C[i][j] = RANDOM;
            }

        }
    steady_clock::time_point End_Time = steady_clock::now();

    duration<double> time_span = duration_cast<duration<double>>(End_Time - Start_Time);
//Clear Matricies
    RandomVar_A.clear();
    RandomVar_B.clear();
    RandomVar_C.clear();

    std::cout << std::endl;
    std::cout << "its done";
    std::cout << std::endl << std::endl;
    std::cout << "Time taken :  " << time_span.count() << " Seconds" << std::endl << std::endl;
    std::cout << "End Of Program" << std::endl << std::endl;
    system("pause");
    return 0;
}
//  *************** END OF PROGRAM ***************

2 个答案:

答案 0 :(得分:1)

三个100,000 x 1,000双打阵列代表3亿双打。假设有8个字节的双字节,那就是大约2.3 GB的内存。默认情况下,您的进程在Windows上默认限制为2 GB(即使您在计算机上安装了更多RAM)。但是,有一些方法可以让您的流程访问更大的地址空间:Memory Limits for Windows

答案 1 :(得分:1)

我遇到类似的东西,然后我的32位应用程序分配超过2Gb的内存。 你的载体需要大约2.1Gb的内存,所以它可能是同样的问题。 尝试将应用程序的平台更改为x64。这可能会解决问题。