不应该这个代码崩溃

Sha*_*fiz 6 c++ new-operator dynamic-memory-allocation

int *p;
while(true)
{
 p = new int;
}
Run Code Online (Sandbox Code Playgroud)

由于内存空间不足,此代码不应该崩溃.我已经尝试打印出p的值,即p的内存地址,它似乎增加但没有崩溃.

为什么会这样?

Jar*_*Par 9

这种解决方案就像试图在驾驶1MPH时在街道上的电线杆上撞车.它最终会发生,但如果你想要快速的结果,你需要提高速度.

int *p;
while (true) { 
  p = new int[1024*1024*1024];
}
Run Code Online (Sandbox Code Playgroud)

我的答案是基于你的代码库使用标准的STL分配器,它会导致内存分配失败.还有其他可用的分配器只返回NULL失败的分配.这种类型的分配器永远不会在此代码中崩溃,因为失败的分配不被认为是致命的.您必须检查分配的返回,NULL以便检测错误.

另一个警告,如果你在64位系统上运行,由于地址空间的大小增加,这可能需要相当长的时间才能崩溃.它不是在街上进行电话调查,而是在全国各地.


cod*_*ict 9

在你看到崩溃之前看起来你不会关闭这个问题:)

在类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)


Kea*_*eks 7

小块内存的几个分配比一个大分配慢.例如,分配4个字节100万次,而不是1百万个字节,需要4次.

尝试一次分配更大的内存块:

int *p;
while(true)
{
 p = new int[1024*1024];
}
Run Code Online (Sandbox Code Playgroud)

  • 这有点误导.小对象的内存分配并不比大对象慢.使用小分配只需要更多的迭代就可以耗尽内存. (2认同)