zoukankan      html  css  js  c++  java
  • c++中小问题(一):一个有趣的问题及std_new_handler()的使用方法

    今天玩c++的时候遇到一个有趣的问题,后来意识到问题所在的时候,发现原因是自己一直以来都习惯性的忽视编译的警告信息。程序如下:

    #include<iostream>
    #include<cstdlib>
    #include<new>
    void no_memory(){
        std::cout <<"Failed to allocate memory!
    ";
        std::exit(1);
    }
    
    int main(){
        std::set_new_handler(no_memory);
        std::cout << "Attempting to allocate 5 TiB...";
        char * p = new char[1024*1024*1024*1024*5];
        std::cout  << "OK
    ";
        delete[] p;
        return 0;
    }

    上述程序,在Qt上编译运行,结果如下

     可以看到,5T的空间,都能分配成功。按照我的电脑16G内存+1.5T硬盘,为什么还能分配成功嘞。百思不得其解。

    后来使用g++来编译,输出警告信息如图:

    嗯,溢出了。按照c++的规定,所有的整数字面值,其类型都是int型,如果做算术运算结果超出了int型的最大值,就会重新计算。所以1024*1024*1024*5=0;这样这个new操作也的确就可以成功分配0大小的空间。

    只要把类型改成unsigned long long类型,就可以得到想要的结果。

     

    再来介绍下 set_new_handler(function_pointer) ,这个函数定义于 <new> 文件中,用来设置当new分配空间出现错误时,要执行的函数。可以通过函数指针来指定。如果function_pointer参数为空,则在new分配失败后,会执行默认的handler函数,该函数会抛出bad_alloc异常。

  • 相关阅读:
    逆元
    和平委员会
    抢掠计划
    间谍网络
    hacker发展流程图 菜菜学习中
    程序员练级之路
    程序员练级之路
    程序员练级之路
    程序员练级之路
    南邮STITP 基于图挖掘的大规模动态交互网络热点区域识别及分布式处理 立项书
  • 原文地址:https://www.cnblogs.com/mindulmindul/p/12239983.html
Copyright © 2011-2022 走看看