c++申请大的内存空间(如何判断失败)

panzhijiepanzhiyang 2011-03-12 11:48:26
我想用new申请一个特别大的空间(多大都可以),主要是我不能判断到底是成功还是失败
假如我这样写 int *p_i=new int[1024*1024*1024];
网上说判断p是否为null
可我写了判断不出来啊
但是确实失败了
p[i]=xxxx;
系统就报错
各位大侠帮忙 只要我能判断 哪怕一个人回的 只要解决了 分全给你 在线等
...全文
935 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
clever101 2012-10-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

LZ不用试了,肯定失败。你想想一个int是4个字节。1024*1024*1024个就是4GB。Windows每个进程的私有的虚拟内存空间大小就只有4GB。你要是都分配了,别的程序代码放哪里啊。
你最好现实一些,一般性能考虑不要一次分配超过50%的内存。而且超过5MB以上的大块内存最好不要用new,因为它会在堆里分配,堆适合小的零碎数据。大块内存请用VirtualAlloc()直接向OS申请。
……
[/Quote]

试试AWE-地址窗口扩展。

在没有系统没有打开3G开关的情况下,用户地址空间只有2G,一次的虚拟内存分配大小上限远小于2G。
VirtualAlloc(NULL, nMemLen*sizeof(CUnit), MEM_RESERVE | MEM_COMMIT, AGE_READWRITE); 之所以有时候还能分配成功,是因为当nMemLen*sizeof(CUnit)大于4G时会被截短为DWORD,别忘了32位只能寻址4G的地址空间,当nMemLen*sizeof(CUnit)为4.001G时,截短后的DWORD为0.001G也就是1M,windows认为你只想分配1M,所以分配成功了,但当你访问这1M后面的字节时,问题就来了,如果后面的内存没有提交或不可读,那么读时会引发读异常;如果后面的内存不写,写时会引发写异常;即便可写,同样意味着不远的将来会出错,因为那不已经不属于你的内存。

  • 打赏
  • 举报
回复
很奇葩的想法
pengzhixi 2011-03-12
  • 打赏
  • 举报
回复
null那是针对malloc的。new的话可以捕捉异常。而你要做的是避免这样大的内存分配。
雪人2015 2011-03-12
  • 打赏
  • 举报
回复
我试了一下,

我的电脑内存2G,我申请1G空间的时候用异常捕获是可以的。
但如果我申请超过了1G空间,程序直接崩溃不给你捕捉的机会。

希望对楼主有帮助。
辰岡墨竹 2011-03-12
  • 打赏
  • 举报
回复
额,忘记说了一条,其实这4GB空间有一半是系统内核空间保留的。你的程序只能分配2GB,而且一般的MFC程序即使没有特别操作会加载很多dll,还有很多保留不可写的空间,你能用1.5GB就不错了。
辰岡墨竹 2011-03-12
  • 打赏
  • 举报
回复
LZ不用试了,肯定失败。你想想一个int是4个字节。1024*1024*1024个就是4GB。Windows每个进程的私有的虚拟内存空间大小就只有4GB。你要是都分配了,别的程序代码放哪里啊。
你最好现实一些,一般性能考虑不要一次分配超过50%的内存。而且超过5MB以上的大块内存最好不要用new,因为它会在堆里分配,堆适合小的零碎数据。大块内存请用VirtualAlloc()直接向OS申请。
quwei197874 2011-03-12
  • 打赏
  • 举报
回复
如果是vc的话可以配置成5M的内存
xgy8705023 2011-03-12
  • 打赏
  • 举报
回复
用异常来判断
xgy8705023 2011-03-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 guankle 的回复:]
标准C++用抛出异常来处理new内存分配失败的问题,所以你可以这样写:
try
{
int *p_i=new int[1024*1024*1024];
}
catch(bad_alloc &memExp)
{
// 失败以后,要么 abort 要么重分配
cerr<<memExp.what()<<endl;
}
如果分配失败了,程序就跳过之后的……
[/Quote]
  • 打赏
  • 举报
回复
楼上的也许你真成功了 但你那是1m 它当然有可能不为空 我说的意思是明明已经失败了 但是却不是null值 我无法判断
  • 打赏
  • 举报
回复
我不是真幻想 分这么大 我是想有法判断 网上说判断null 可是根本不行我操
xgy8705023 2011-03-12
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
int main()
{
int* p=new int[1024*1024];
if (NULL!=p) {
p[0]=1;
} else {
cout<<"指针未申请成功"<<endl;
}
}这样就可以
乐哉悠哉 2011-03-12
  • 打赏
  • 举报
回复
标准C++用抛出异常来处理new内存分配失败的问题,所以你可以这样写:
try
{
int *p_i=new int[1024*1024*1024];
}
catch(bad_alloc &memExp)
{
// 失败以后,要么 abort 要么重分配
cerr<<memExp.what()<<endl;
}
如果分配失败了,程序就跳过之后的代码,输出错误信息。
更具体的可以参考《Effective c++》。

xgy8705023 2011-03-12
  • 打赏
  • 举报
回复
LZ内存分配的太大了
xgy8705023 2011-03-12
  • 打赏
  • 举报
回复
用new分配这么大的内存根本没有意义。默认windows堆大小是 1M
  • 打赏
  • 举报
回复
恩看来捕捉不是万能的 我今天也是突发奇想 试了一下 发现有些时候一些看似简单的问题 自己都弄不明白 结贴

64,648

社区成员

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

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