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上编译运行,结果如下
可以看到,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异常。
相关推荐
文山羊 2020-11-07
susmote 2020-11-07
拉斯厄尔高福 2020-11-04
xceman 2020-10-23
hellojunz 2020-10-23
caojhuangy 2020-10-12
xinyupan 2020-09-28
lousir 2020-09-27
一个逗逗 2020-09-22
Maryhuan 2020-09-20
rkhstar 2020-09-09
DreamSnow 2020-09-09
aehousmantao 2020-09-03
tkernel 2020-09-03
abfdada 2020-08-26
svap 2020-08-25
二十不悔三十而立 2020-08-19
FlightForever 2020-08-17
joyjoy0 2020-08-13