int *p;
while(true)
{
p = new int;
}由于内存空间不足,这段代码不会崩溃吗?我试着打印出p的值,也就是p所在的内存地址,它似乎增加了,但没有崩溃。
为何会这样呢?
发布于 2010-10-26 01:51:39
这个解决方案就像是在以每小时1英里的速度行驶时,试图将一辆汽车撞到街道的电线杆上。这最终会发生,但如果你想要更快的结果,你需要提高一点速度。
int *p;
while (true) {
p = new int[1024*1024*1024];
}不过,我的答案是基于使用标准STL分配器的代码库,它会抛出一个失败的内存分配。还有其他可用的分配器,它们只是在分配失败时返回NULL。这种类型的分配器在这段代码中永远不会崩溃,因为失败的分配不会被认为是致命的。您必须检查NULL分配的返回,以便检测错误。
另一个警告是,如果您在64位系统上运行,由于地址空间的大小增加,这可能需要相当长的时间才能崩溃。电话投票不是在大街上进行,而是在全国范围内进行。
发布于 2010-10-26 02:03:54
看起来你不会结束这个问题,直到你看到一个崩溃:)
在类Unix操作系统上,您可以使用命令限制进程可用的虚拟内存量。通过将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发布于 2010-10-26 01:49:05
几次分配较小的内存块比一次分配较大的内存慢。例如,1百万次分配4个字节要比4次分配1百万字节花费更多的时间。
尝试一次分配更大的内存块:
int *p;
while(true)
{
p = new int[1024*1024];
}https://stackoverflow.com/questions/4017343
复制相似问题