我正在学习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);
}
}
答案 0 :(得分:3)
总结@Peter在评论中说的话:您的i
变量计算的是分配数量,而不是分配的内存总量。
但是请注意,即使您“解决”此问题,您获得的也不是“可用内存”的数量,也不是舍入到8000的整数倍的可用内存。这是因为“可用内存”不是一个很好定义的概念。操作系统可能愿意让您分配不计其数的字节。但是在您开始写入到该内存之前,它实际上可能不会执行其他进程可见的任何操作。即使您确实对其进行写入,它也可以将未使用的内存页面交换到硬盘/ SSD,以为正在处理的页面腾出空间。
如果要检查使用new
可以分配的最大内存量,则可以考虑使用类似于二进制搜索的过程来获取大小;万一那是你的家庭作业,我不会说清楚。 (当然,由于其他进程的内存使用情况会发生变化,因此这也不是准确的。)
还可以考虑阅读:How to get available memory C++/g++?
最后,一些挑剔:
i
对于变量来说不是一个好名字。 num_allocations
更合适。当您使用一个更有意义的名称时,您还将使用其语义,这使得将它们混淆起来更加困难。enum
或constexpr
定义常量。例如:enum { Kilo = 1000 };
。double
-与浮点算法无关。答案 1 :(得分:1)
您绝对正确。应该是:
cerr << "The memory is used up. " << sizeof(double) * i
<< " Kilobyte were available." << endl;