由于我对C ++相当陌生,因此在处理学校作业方面遇到了麻烦。我以前从未接触过。
我要做的工作是创建一种例外机制,以计算可以在程序中分配多少内存(以MB为单位)。
我应该使用new[]
运算符和catch()
,并且只能使用一个变量。
我已经尝试过密码了,到目前为止,这是我所拥有的。我不知道我是否在正确的轨道上。任何建议表示赞赏。谢谢。
int main() {
char *mem;
unsigned long long count = 1;
while (1) {
mem = new char[1025 * 1054];
if (mem == NULL)
break;
free(mem);
count++;
}
std::cout << "count: " << count * 1024000;
}
答案 0 :(得分:2)
警告免费无效并且具有未指定的行为,删除分配的内存的方法是delete [] mem;
此外,在循环中执行 new 然后删除是没有用的,如果要检查限制分配大小,则无需删除(也不免费)当然)
如果您想知道 continuous 块的最大大小,请执行初始的 malloc ,然后在循环中 realloc 增大大小获取NULL
例如
#include <stdlib.h>
#include <iostream>
int main() {
void * mem = malloc(0);
size_t count = 0;
while ((mem = realloc(mem, (++count)*1024*1024)) != NULL)
;
free(mem);
std::cout << "count: " << --count << "Mb" << std::endl;
}
请注意,该程序不会写入分配的内存,因此我可以在我的树莓派上执行它,而无需杀死它会产生交换:
pi@raspberrypi:/tmp $ g++ -pedantic -Wextra a.cc
pi@raspberrypi:/tmp $ ./a.out
count: 1023Mb
pi@raspberrypi:/tmp $
使用C ++ new :
#include <stdlib.h>
#include <iostream>
int main() {
char * mem;
size_t count = 0;
try {
while (true) {
mem = new char [(++count)*1024*1024];
delete [] mem;
}
}
catch (std::bad_alloc &) {
}
std::cout << "count: " << --count << "Mb" << std::endl;
}
编译和执行:
pi@raspberrypi:/tmp $ g++ -pedantic -Wextra a.cc
pi@raspberrypi:/tmp $ ./a.out
count: 543Mb
结果不一样,它更加逼真并且与我拥有的空闲内存相对应
答案 1 :(得分:1)
void* operator new ( std::size_t count );
将在分配内存失败时引发异常std::bad_alloc
。
所有您需要做的就是创建一个函数,该函数在发生故障时以较小的内存大小自行分配调用。例如,您可以执行以下操作:
#include <iostream>
void allocate_me(size_t size)
{
try{
uint64_t* a = new uint64_t[size] ;
std::cout << "Size is : " << size << std::endl;
}
catch(std::bad_alloc &e)
{
allocate_me(size-1024);
}
}
int main()
{
size_t var = 1024*1024*1024;
allocate_me(var);
std::cout << "Hello, world!\n";
}
请注意,初始内存大小和减量取决于您的系统。
另一种解决方案可能是简单地查看可用的RAM-在Linux中,您可以使用sysinfo
或查看文件/proc/meminfo
-然后从这一点开始。