首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不依赖虚拟内存的C++程序

不依赖虚拟内存的C++程序
EN

Stack Overflow用户
提问于 2020-03-31 05:55:32
回答 1查看 68关注 0票数 0

我正在做的一个家庭作业要求我们耗尽我们的主内存,以便程序使用虚拟内存,以便我们可以观察和测量减慢。然而,当我达到足够大的内存值时,我会分段错误或崩溃。我需要在耗尽主内存的同时使用虚拟内存,我的印象是windows (或其他操作系统)会解决这个问题,至少在我看来是这样的。我用来观察这个的程序:

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-31 07:52:17

每个对new的调用都应该有一个对应的delete调用,每个对new[]的调用都应该有一个对应的delete[]调用。

通过在使用new[]分配的内存块上调用delete,您将导致undefined behavior。这可能是导致崩溃的原因。

要解决此问题,必须更改行

代码语言:javascript
复制
delete A[i];
delete B[i];
delete C[i];

代码语言:javascript
复制
delete[] A[i];
delete[] B[i];
delete[] C[i];

还有那些台词

代码语言:javascript
复制
delete A;
delete B;
delete C;

代码语言:javascript
复制
delete[] A;
delete[] B;
delete[] C;

此外,您可能希望增加页面文件的大小,这样new就不会很快失败。对于Windows7,请参阅this link了解如何增加页面文件大小。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60940176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档