Программа C ++ не полагается на виртуальную память - PullRequest
0 голосов
/ 31 марта 2020

Домашнее задание, над которым я работаю, требует, чтобы мы исчерпали основную память, чтобы программа использовала виртуальную память, чтобы мы могли наблюдать и измерять замедление. Тем не менее, когда я получаю достаточно большие значения памяти, я segfault или cra sh. Мне нужно исчерпать основную память и использовать виртуальную память одновременно, и у меня сложилось впечатление, что windows (или другие операционные системы) просто позаботятся об этом, по крайней мере, так, как это было показано мне. Программа, которую я использую, чтобы наблюдать это:

#include <stdio.h>
#include <iostream>
#include <chrono>

int sizes[] = { 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536 };

using namespace std::chrono;

int main(int c, char** args)
{
    int** A;
    int** B;
    int** C;
    for (int n : sizes)
    {
        A = new int*[n];
        B = new int*[n];
        C = new int*[n];
        for (int i = 0; i < n; i++) {
            A[i] = new int[n];
            B[i] = new int[n];
            C[i] = new int[n];
        }
        milliseconds pre_add1 = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                C[i][j] = A[i][j] + B[i][j];
            }
        }
        milliseconds post_add1 = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
        milliseconds pre_add2 = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
        for (int j = 0; j < n; j++)
        {
            for (int i = 0; i < n; i++)
            {
                C[i][j] = A[i][j] + B[i][j];
            }
        }
        milliseconds post_add2 = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
        for (int i = 0; i < n; i++) {
            delete A[i];
            delete B[i];
            delete C[i];
        }
        delete A;
        delete B;
        delete C;
        std::cout << "Size " << n << " took " << (post_add1 - pre_add1).count() << " ms for addition 1" << std::endl;
        std::cout << "Size " << n << " took " << (post_add2 - pre_add2).count() << "ms for addition 2" << std::endl;
    }
    return 0;
}

1 Ответ

1 голос
/ 31 марта 2020

Каждый вызов new должен иметь соответствующий вызов delete, а каждый вызов new[] должен иметь соответствующий вызов delete[].

Вместо вызова delete для блока памяти, выделенного с помощью new[], вы вызываете неопределенное поведение . Это, вероятно, причина вашего cra * sh.

Чтобы решить проблему, вы должны изменить строки

delete A[i];
delete B[i];
delete C[i];

на

delete[] A[i];
delete[] B[i];
delete[] C[i];

и линии

delete A;
delete B;
delete C;

до

delete[] A;
delete[] B;
delete[] C;

Кроме того, вы можете увеличить размер файла подкачки, чтобы new не терпел неудачу так быстро. Для Windows 7 см. эту ссылку о том, как увеличить размер файла подкачки.

...