bad_alloc异常 不正常

ufdxkm 2009-03-20 09:10:31
#include <iostream>
#include <new>
#include <cstdlib>

using namespace std;

struct Big
{
double stuff[20000];
};

int main()
{
Big* pb;
try
{
cout<<"Trying to get a big block of memory:\n";
pb=new Big[10000];
cout<<"Get past the new requeset:\n";
}
catch(bad_alloc &ba)
{
cout<<"Caught the exception!\n";
cout<<ba.what()<<endl;
exit(EXIT_FAILURE);
}
if(pb!=0)
{
pb[0].stuff[0]=4;
cout<<pb[0].stuff[0]<<endl;
}
else
{
cout<<"Pb is null pointer\n";
}
delete []pb;
return 0;
}


我调试上边的代码 出现占用内存1.多GB.. 是什么问题?
...全文
215 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ufdxkm 2009-03-20
  • 打赏
  • 举报
回复
先谢谢楼上各位和lzr4304061988012 -_- 太长了 登陆很不方便吧 呵呵 期待解决。
lzr4304061988012 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 eidolondedidi 的回复:]
可以这样理解吗:我没有捕捉到异常是因为我的内存大。。只有光标没有输出第二行是因为我的配置低。。速度慢?
[/Quote]
但是你这个程序在DEV-C++中又能很好运行,运行结果显示未有抛出异常.
lzr4304061988012 2009-03-20
  • 打赏
  • 举报
回复

[code=C/C++]
//我的理解是 4*10000 * 20000是没抛出异常,但是VC不同于DEV-c出现,没有结果输出,
//很奇怪,你把程序改成下面VC也可以正常输出了。
#include <iostream>
#include <new>
#include <cstdlib>

using namespace std;

struct Big
{
char stuff[0x7fffffff];
};

int main()
{
Big* pb;
try
{
cout<<"Trying to get a big block of memory:\n";
pb = new Big;
cout<<"Get past the new requeset:\n";
}
catch(bad_alloc &ba)
{
cout<<"Caught the exception!\n";
cout<<ba.what()<<endl;

exit(EXIT_FAILURE);
}
/* if(pb!=0)
{
pb[0].stuff[0]=4;
cout<<pb[0].stuff[0]<<endl;
}
else
{
cout<<"Pb is null pointer\n";
}
delete pb;
*/

return 0;
}
ufdxkm 2009-03-20
  • 打赏
  • 举报
回复
可以这样理解吗:我没有捕捉到异常是因为我的内存大。。只有光标没有输出第二行是因为我的配置低。。速度慢?
beyond071 2009-03-20
  • 打赏
  • 举报
回复
struct Big
{
double stuff[20000];
};

这个结构体一个就是20000*sizeof(double)个字节

 pb=new Big[10000]; 

这里分配10000个Big结构,就是10000* 20000 * sizeof(double) 是1.5G内存
一般用new是在堆上分配,但windows可能会用到一部分虚拟内存来顶替物理内存,如果虚拟内存加当前空闲的物理内存不足1.5G的话 一开始就会bad_allac()
ufdxkm 2009-03-20
  • 打赏
  • 举报
回复
我用vs2005 我的直接第一行字 后边就没有了。。
难道我配置低。。。
lzr4304061988012 2009-03-20
  • 打赏
  • 举报
回复
楼主有的VC6.0么?
我用DEV-C++把20000---》200000后捕获异常了

//20000时的结果:

Trying to get a big block of memory:
Get past the new requeset:
4
请按任意键继续. . .


//200000时的结果:

Trying to get a big block of memory:
Caught the exception!
St9bad_alloc
请按任意键继续. . .

我的是1GB physical memory


tangshuiling 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 beyond071 的回复:]
10000 * 20000 * 4 约763M
[/Quote]
应该是10000*20000*8 约合1.5G内存
leechrockgames 2009-03-20
  • 打赏
  • 举报
回复
pb=new Big[10000];
这个也是
leechrockgames 2009-03-20
  • 打赏
  • 举报
回复
double stuff[20000];
这个建得太大了
ufdxkm 2009-03-20
  • 打赏
  • 举报
回复
能不能详细些? 谢谢!
beyond071 2009-03-20
  • 打赏
  • 举报
回复
10000 * 20000 * 4 约763M

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧