首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这段代码不应该崩溃吗?

这段代码不应该崩溃吗?
EN

Stack Overflow用户
提问于 2010-10-26 01:46:06
回答 6查看 474关注 0票数 6
代码语言:javascript
复制
int *p;
while(true)
{
 p = new int;
}

由于内存空间不足,这段代码不会崩溃吗?我试着打印出p的值,也就是p所在的内存地址,它似乎增加了,但没有崩溃。

为何会这样呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-10-26 01:51:39

这个解决方案就像是在以每小时1英里的速度行驶时,试图将一辆汽车撞到街道的电线杆上。这最终会发生,但如果你想要更快的结果,你需要提高一点速度。

代码语言:javascript
复制
int *p;
while (true) { 
  p = new int[1024*1024*1024];
}

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

另一个警告是,如果您在64位系统上运行,由于地址空间的大小增加,这可能需要相当长的时间才能崩溃。电话投票不是在大街上进行,而是在全国范围内进行。

票数 9
EN

Stack Overflow用户

发布于 2010-10-26 02:03:54

看起来你不会结束这个问题,直到你看到一个崩溃:)

在类Unix操作系统上,您可以使用命令限制进程可用的虚拟内存量。通过将VM设置为1MB,我能够在大约5秒内看到所需的结果:

代码语言:javascript
复制
$ 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
票数 9
EN

Stack Overflow用户

发布于 2010-10-26 01:49:05

几次分配较小的内存块比一次分配较大的内存慢。例如,1百万次分配4个字节要比4次分配1百万字节花费更多的时间。

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

代码语言:javascript
复制
int *p;
while(true)
{
 p = new int[1024*1024];
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4017343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档