1000倍有多大?

时间:2019-03-30 21:21:42

标签: c++ exception memory out-of-memory

我正在学习c ++,在一堂课中有一段关于异常处理的代码。该代码不是我的,它只是“ try and catch”的示例。所以这个问题与代码质量无关

我对这段代码的问题实际上是:内存大小的输出和计算是否正确? 当我用new double(1000)分配一个内存块时,大小不是8000个字节吗?

cerr输出仅计为1kB,而不是8kB。我错了吗?

我用sizeof(double)得到了1倍的大小,以确认它是8个字节。

#include <iostream>
#include <cstdlib>
#include <new>
using namespace ::std;
int main()
{
    int i = 0;
    double *q;

try
{
    while (1)
    {
        q = new double[1000];
        i++;
    }
}
catch (bad_alloc &ex)
{
    cerr << "The memory is used up.  " << i
         << " Kilobyte were available." << endl;
    exit(1);
}
}

2 个答案:

答案 0 :(得分:3)

总结@Peter在评论中说的话:您的i变量计算的是分配数量,而不是分配的内存总量。

但是请注意,即使您“解决”此问题,您获得的也不是“可用内存”的数量,也不是舍入到8000的整数倍的可用内存。这是因为“可用内存”不是一个很好定义的概念。操作系统可能愿意让您分配不计其数的字节。但是在您开始写入到该内存之前,它实际上可能不会执行其他进程可见的任何操作。即使您确实对其进行写入,它也可以将未使用的内存页面交换到硬盘/ SSD,以为正在处理的页面腾出空间。

如果要检查使用new可以分配的最大内存量,则可以考虑使用类似于二进制搜索的过程来获取大小;万一那是你的家庭作业,我不会说清楚。 (当然,由于其他进程的内存使用情况会发生变化,因此这也不是准确的。)

还可以考虑阅读:How to get available memory C++/g++?


最后,一些挑剔:

  • 您使用的缩进不一致。令人困惑。
  • i对于变量来说不是一个好名字。 num_allocations更合适。当您使用一个更有意义的名称时,您还将使用其语义,这使得将它们混淆起来更加困难。
  • 尝试避免使用1000等“魔术数字”。使用enumconstexpr定义常量。例如:enum { Kilo = 1000 };
  • 在这样的程序中似乎没有充分的理由使用double-与浮点算法无关。

答案 1 :(得分:1)

您绝对正确。应该是:

cerr << "The memory is used up.  " << sizeof(double) * i
     << " Kilobyte were available." << endl;