Sha*_*fiz 6 c++ new-operator dynamic-memory-allocation
int *p;
while(true)
{
p = new int;
}
Run Code Online (Sandbox Code Playgroud)
由于内存空间不足,此代码不应该崩溃.我已经尝试打印出p的值,即p的内存地址,它似乎增加但没有崩溃.
为什么会这样?
这种解决方案就像试图在驾驶1MPH时在街道上的电线杆上撞车.它最终会发生,但如果你想要快速的结果,你需要提高速度.
int *p;
while (true) {
p = new int[1024*1024*1024];
}
Run Code Online (Sandbox Code Playgroud)
我的答案是基于你的代码库使用标准的STL分配器,它会导致内存分配失败.还有其他可用的分配器只返回NULL
失败的分配.这种类型的分配器永远不会在此代码中崩溃,因为失败的分配不被认为是致命的.您必须检查分配的返回,NULL
以便检测错误.
另一个警告,如果你在64位系统上运行,由于地址空间的大小增加,这可能需要相当长的时间才能崩溃.它不是在街上进行电话调查,而是在全国各地.
在你看到崩溃之前看起来你不会关闭这个问题:)
在类Unix操作系统上,您可以使用ulimit命令限制进程可用的虚拟内存量.通过将VM设置为1MB,我能够在大约5秒钟内看到所需的结果:
$ ulimit -v $((1024*1024)) # set max VM available to process to 1 MB
$ ulimit -v # check it.
1048576
$ time ./a.out # time your executable.
terminate called after throwing an instance of 'St9bad_alloc'
what(): std::bad_alloc
Aborted
real 0m5.502s
user 0m4.240s
sys 0m1.108s
Run Code Online (Sandbox Code Playgroud)
小块内存的几个分配比一个大分配慢.例如,分配4个字节100万次,而不是1百万个字节,需要4次.
尝试一次分配更大的内存块:
int *p;
while(true)
{
p = new int[1024*1024];
}
Run Code Online (Sandbox Code Playgroud)