[英]Why memory allocation of 2^80 bytes doesn't fail?
以下代码不会抛出异常并打印“成功”。 为什么?
#include <iostream>
int main()
{
size_t size = size_t(1024)*1024*1024*1024*1024*1024*1024*1024;
char* data = new char[size];
if (data == NULL)
std::cout << "fail" << std::endl;
else
std::cout << "success" << std::endl;
return 0;
}
如果这是它的工作方式,我如何检查我有足够的内存?
[ 编辑:让我的愚蠢代码更正确,现在如果我删除两个*1024
,它至少会在x64上失败]
我的编译器可以回答这个:
$ g++ --version
g++ (GCC) 4.7.1 20120721 (prerelease)
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ g++ -Wall -Wextra -pedantic q12507456.c++
q12507456.c++: In function 'int main()':
q12507456.c++:5:42: warning: integer overflow in expression [-Woverflow]
$
这很可能是因为您请求的数字太大而无法存储在整数中,并且您在这里遇到溢出并且分配的内存实际上远远低于您的想象。
根据http://en.wikipedia.org/wiki/Yobibyte,这里有2 ^ 80 = 1208925819614629174706176
1024*1024*1024*1024*1024*1024*1024*1024
计算时会导致整数溢出 - 也就是说,它将取模2 ^ 32(或2 ^ 64,具体取决于您的系统),并且这是可以分配的零字节。
也许你知道以下内容,但我会说明它只是为了澄清。 不会抛出异常,代码正在由if语句测试。 无论您使用哪种术语和方法进行测试,都需要注意更相关的观察。 您的系统保存整数的最大值,C ++将在编译期间通过检查并相应地采取某种方式来考虑它。 再一次,你可能也已经知道了。 我的猜测是,该值要么回到0,那么要达到过量,要么指针开始指向它之前的值保持不变(最有可能)。 在这种情况下,指针不会为NULL
。 尝试在声明时将其NULL
,然后分配内存并查看天气或不通过你的if语句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.