内存块太小导致malloc和new返回空指针,该怎么处理?

  • 对于malloc来说,需要判断其是否返回空指针,如果是则马上用return语句终止该函数或者exit终止该程序;

  • 对于new来说,默认抛出异常,所以可以使用try...catch...代码块的方式:

    try {
      int *ptr = new int[10000000];
    } catch(bad_alloc &memExp) {
      cerr << memExp.what() << endl;
    }
    

    还可以使用set_new_handler函数的方式:

    void no_more_memory() {
      cerr << "Unable to satisfy request for memory" << endl;
      abort();
    }
    int main() {
      set_new_handler(no_more_memory);
      int *ptr = new int[10000000];
    }
    

    在这种方式里,如果new不能满足内存分配请求,no_more_memory会被反复调用,所以new_handler函数必须完成以下事情:

    • 让更多内存可被使用:可以在程序一开始执行就分配一大块内存,之后当new_handler第一次被调用,就将这些内存释放还给程序使用;
    • 使用另一个new_handler
    • 卸除new_handler:返回空指针,这样new就会抛出异常;
    • 直接抛出bad_alloc异常;
    • 调用abortexit

发表评论

后才能评论

评论(2)

  • mpweixin用户 普通 2023-02-11 12:19 下午

    这个问题本身就有问题。“内存块太小”通常不会导致malloc返回空指针。在我机器上,malloc(0)都不会返回空指针。

  • Persona 普通 2021-09-07 3:29 下午

    可以用new(std::nothrow)版本来返回空指针而不是抛出异常