Необработанное исключение в 0x76CC1812 в NS-VSF.exe: исключение Microsoft C ++: std :: bad_alloc в ячейке памяти 0x00AFF5D4 - PullRequest
0 голосов
/ 03 января 2019

Я запускаю код для решения некоторых вычислительных задач.Когда я делю свой домен на маленькую сетку, например 16 * 16, проблем не будет.Но как только я увеличиваю размер сетки до 121 * 121 (используя больше памяти), появляется эта проблема:

Необработанное исключение в 0x76CC1812 в NS-VSF.exe: исключение Microsoft C ++: std :: bad_alloc в ячейке памяти 0x00AFF5D4.

Я использую динамическое распределение, чтобы использовать как можно меньше памяти (согласно моей способности C ++).Я попытался использовать менее динамический массив в функции, что эта ошибка памяти происходит.но опять та же проблема!

void Poisson(double **A, double **B) {
    double **B_old = new double*[M + 2];
    for (int i = 0; i < M + 2; ++i) B_old[i] = new double[N + 2]();
    double a_x, a_y, a_w;
    a_x = pow(delta_y, 2) / (2 * (pow(delta_x, 2) + pow(delta_y, 2)));
    a_y = pow(delta_x, 2) / (2 * (pow(delta_x, 2) + pow(delta_y, 2)));
    a_w = (pow(delta_x, 2)*pow(delta_y, 2)) / (2 * (pow(delta_x, 2) + pow(delta_y, 2)));

    double convergence = 1.0; //to be updated with L2-norm
    int k = 0; //number of iterations
    while (convergence > 1e-10) {
        for (int i = 2; i < M; i++) {
            for (int j = 2; j < N; j++) {
                B_old[i][j] = B[i][j];
            }
        }
        double sum = 0.0;
        for (int i = 2; i < M; i++) {
            for (int j = 2; j < N; j++) {
                B[i][j] = a_x * (B[i + 1][j] + B[i - 1][j]) + a_y * (B[i][j + 1] + B[i][j - 1]) + a_w * A[i][j];
                B[i][j] = B_old[i][j] + w_SOR *(B[i][j] - B_old[i][j]); //SOR
                sum = sum + pow(B[i][j] - B_old[i][j], );
            }
        }
        convergence = sqrt(sum / (M*N));    // L2-norm criteria
        k++;
        if (k%200 == 0)
        cout << "k= " << k << "..........." << convergence << endl;
    }
    //free memory
    for (int i = 0; i < M + 2; ++i) delete[] B_old[i]; delete[] B_old;
}
...