LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 962|回复: 3

指针申请与释放疑问

[复制链接]
发表于 2005-8-16 09:50:55 | 显示全部楼层 |阅读模式
发信人: zollow (小小侠客), 信区: LinuxDev
标  题: 有new没有delete的怪问题。
发信站: 水木社区 (Mon Aug 15 17:10:39 2005), 站内

我写了一个程序,其中:
....
class CVS{
public:
  int *my_mem;
  CVS(){
     my_mem = new int[32700];
  }
  ~CVS(){
     delete []my_mem;
  }
};

int main()
{
  .....
  CVS *p;
  while(1)
  {
     p = new CVS[32700];
   ....
     // delete []p;
  }
  .....
  return 0;
}

我故意注释掉了delete那行,按我的理解, 程序应该不断地申请内存直到耗尽,
结果是我在用ps看的时候这个程序占用的内存基本不变,而且不久就出了错误:
terminate called after throwing an instance of 'std::bad_alloc'
what(): St9bad_alloc
虔诚请教各位达人这是为什么,怎么不是像我想的那样呢?另外实际上内存还有一定的空间呢,为什么这时候就bad_alloc了?
发表于 2005-8-16 13:36:51 | 显示全部楼层
你实际是在大量的申请虚拟内存。而TOP是看实存占有情况。
申请了1M虚存并不等于占用了系统的1M实际内存。 只有当有数据写入虚拟内存时,才会去占用实际内存。
你可以试试在构造函数中申请到空间后, 写值到对应空间。 就会发现TOP后的内存与你想象的一样了。

会出现申请失败可能是因为3GB虚拟内存已经耗光。
回复 支持 反对

使用道具 举报

发表于 2005-8-16 14:45:27 | 显示全部楼层
Post by 弥敦路九号
你实际是在大量的申请虚拟内存。而TOP是看实存占有情况。
申请了1M虚存并不等于占用了系统的1M实际内存。 只有当有数据写入虚拟内存时,才会去占用实际内存。
你可以试试在构造函数中申请到空间后, 写值到对应空间。 就会发现TOP后的内存与你想象的一样了。

会出现申请失败可能是因为3GB虚拟内存已经耗光。


注意一下,并不是3G已经用完,只是堆空间被用完,有可能还有空间没有用到
回复 支持 反对

使用道具 举报

发表于 2005-8-16 19:45:15 | 显示全部楼层
Post by rickxbx
注意一下,并不是3G已经用完,只是堆空间被用完,有可能还有空间没有用到

多谢指正. 正是如此.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表