c++中小问题(一):一个有趣的问题及std_new_handler()的使用方法

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

#include<iostream>
#include<cstdlib>
#include<new>
void no_memory(){
    std::cout <<"Failed to allocate memory!\n";
    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\n";
    delete[] p;
    return 0;
}

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

c++中小问题(一):一个有趣的问题及std_new_handler()的使用方法

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

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

c++中小问题(一):一个有趣的问题及std_new_handler()的使用方法

嗯,溢出了。按照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异常。

c++

相关推荐