BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #89057同步于 2015/10/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

可以无限new对象吗?

yikoudreams
2015/10/12镜像同步4 回复
操作系统对进城的内存使用有无限制?跟虚拟内存换页那些知识有关联不? 比较迷糊,求大神指教!!!
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
wyliewylie机器人#1 · 2015/10/13
应该和换页没有关系。仅与剩余内存量有关。 以linux系统为例,曾经死循环new过4G内存的设备最后剩下400M不到,随即自动被kernel杀掉,对一般程序来说几乎可以认为new是无限制的。 (但代码里对new或者malloc失败的判断一定要有) 另外,在linux里每个进程都有资源限制。 调用getrlimit可以查看。其具体限制保存在rlimit结构体内。 其中包括进程可用存储空间的最大长度;栈的最大字节长度等。
yikoudreams机器人#2 · 2015/10/13
感谢回复。我查了一天有些收获,与大家交流分享下: http://www.kerneltravel.net/journal/v/mem.htm 进程内存的分配与回收 和 如何由虚变实 两部分讲到new在虚拟空间申请不需要关注物理内存,当memset等具体操作内存时才在物理内存又缺页异常进行申请。 http://www.cnblogs.com/jacksu-tencent/p/3377232.html 讲到64位系统进程虚拟空间分布,可见可分配空间异常大。 我做的实验: #include "stdlib.h" #include "stdio.h" int main() { int *a = (int*) malloc (0x000000000fffffff); //250MB if(!a) {printf("error\n");}else{printf("%x \n", a);} int *b = (int*) malloc (0x00001fffffffffff); //32TB if(!b) {printf("error\n");}else{printf("%x \n", b);} int *c = (int*) malloc (0x00007fffffffffff); //128TB/ if(!c) {printf("error\n");}else{printf("%x \n", c);} } 输出如下: 2884000 12885000 a.out(1343,0x7fff7d178000) malloc: *** mach_vm_map(size=140737488355328) failed (error code=3) *** error: can't allocate region *** set a breakpoint in malloc_error_break to debug error 可见当可以malloc(new的底层实现)32TB虚拟空间。但是要malloc一个超过用户空间的内存就不行了。 关于一直new ,不怎么清楚,试了一下死循环:int *a = new int[100] 发现进程被杀死; 又试了一下死循环:int *a = new int[10000000] ;发现terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc 已放弃......。 不是很清楚为什么?。 【 在 wyliewylie 的大作中提到: 】 : 应该和换页没有关系。仅与剩余内存量有关。 : 以linux系统为例,曾经死循环new过4G内存的设备最后剩下400M不到,随即自动被kernel杀掉,对一般程序来说几乎可以认为new是无限制的。 : (但代码里对new或者malloc失败的判断一定要有) : ...................
wyliewylie机器人#3 · 2015/10/14
死循环被系统终止,应该是系统自带的守护进程会自动清理的缘故。 【 在 yikoudreams 的大作中提到: 】 : 感谢回复。我查了一天有些收获,与大家交流分享下: : http://www.kerneltravel.net/journal/v/mem.htm 进程内存的分配与回收 和 如何由虚变实 两部分讲到new在虚拟空间申请不需要关注物理内存,当memset等具体操作内存时才在物理内存又缺页异常进行申请。 : http://www.cnblogs.com/jacksu-tencent/p/3377232.html 讲到64位系统进程虚拟空间分布,可见可分配空间异常大。 : ...................
wyliewylie机器人#4 · 2015/10/14
提供的网址非常好!我赶紧学习一下趁着没活儿干 【 在 yikoudreams 的大作中提到: 】 : 感谢回复。我查了一天有些收获,与大家交流分享下: : http://www.kerneltravel.net/journal/v/mem.htm 进程内存的分配与回收 和 如何由虚变实 两部分讲到new在虚拟空间申请不需要关注物理内存,当memset等具体操作内存时才在物理内存又缺页异常进行申请。 : http://www.cnblogs.com/jacksu-tencent/p/3377232.html 讲到64位系统进程虚拟空间分布,可见可分配空间异常大。 : ...................