C关于例外处理的建议

时间:2019-03-04 17:05:53

标签: c error-handling

由于我对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;
}

2 个答案:

答案 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-然后从这一点开始。