社区
C++ 语言
帖子详情
c++申请大的内存空间(如何判断失败)
panzhijiepanzhiyang
2011-03-12 11:48:26
我想用new申请一个特别大的空间(多大都可以),主要是我不能判断到底是成功还是失败
假如我这样写 int *p_i=new int[1024*1024*1024];
网上说判断p是否为null
可我写了判断不出来啊
但是确实失败了
p[i]=xxxx;
系统就报错
各位大侠帮忙 只要我能判断 哪怕一个人回的 只要解决了 分全给你 在线等
...全文
935
16
打赏
收藏
c++申请大的内存空间(如何判断失败)
我想用new申请一个特别大的空间(多大都可以),主要是我不能判断到底是成功还是失败 假如我这样写 int *p_i=new int[1024*1024*1024]; 网上说判断p是否为null 可我写了判断不出来啊 但是确实失败了 p[i]=xxxx; 系统就报错 各位大侠帮忙 只要我能判断 哪怕一个人回的 只要解决了 分全给你 在线等
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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后面的字节时,问题就来了,如果后面的内存没有提交或不可读,那么读时会引发读异常;如果后面的内存不写,写时会引发写异常;即便可写,同样意味着不远的将来会出错,因为那不已经不属于你的内存。
四流程序员的业余生活
2012-03-10
打赏
举报
回复
很奇葩的想法
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]
panzhijiepanzhiyang
2011-03-12
打赏
举报
回复
楼上的也许你真成功了 但你那是1m 它当然有可能不为空 我说的意思是明明已经失败了 但是却不是null值 我无法判断
panzhijiepanzhiyang
2011-03-12
打赏
举报
回复
我不是真幻想 分这么大 我是想有法判断 网上说判断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
panzhijiepanzhiyang
2011-03-12
打赏
举报
回复
恩看来捕捉不是万能的 我今天也是突发奇想 试了一下 发现有些时候一些看似简单的问题 自己都弄不明白 结贴
C++
new
申请
空间
失败
的
判断
C++
new默认
申请
空间
失败
是抛出异常的,而malloc
申请
失败
默认是返回空指针 方法1、 try catch捕获异常 try { int *p = new int[10000000000]; } catch (bad_alloc &e) { cout << e.what() << endl; } 方法2 强制new不抛出异常,这时候会返回空指针 int *p = new (std::n
c++
编程如果
申请
非常非常大的
内存
空间
时,怎么样
判断
电脑
内存
是否足够
/
C++
编写一个函数模拟动态分配数组的
内存
空间
。 函数具有一个整型参数,它代表待分配的一个整型数组元素的个数。 函数应当完成必要的出错检测(如参数为0或负数), 如果
内存
空间
充足,那么就分配需要的
空间
,并返回指向该
空间
的 指针;否则返回一个空指针/ #include<iostream>` #include<cstdlib> #include<exception>...
C++
中new
申请
内存
失败
抛出异常的处理
正常情况下,执行new操作时都能
申请
到
内存
,并返回一个有效的地址。但在某些异常的情况下,会出现
申请
内存
失败
的情况。 new操作返回NULL
申请
不到
内存
,或者new时抛出异常,可能有以下几种原因引起的: 1)用户态的
内存
已经达到了上限,
申请
不到
内存
了 有可能是虚拟
内存
占用太多,也有可能代码中有
内存
泄露,导致用户态的
内存
被消耗完了。 2)进程中的
内存
碎片过多 如果进程中在大量的new和delete,产生了大量的小块
内存
碎片,可用的
内存
大多是一小块一小块的小
内存
块,而要
申请
的是一块长......
C++
中 用new
申请
堆
空间
失败
之后,怎么进行错误处理
在使用 new 运算符时,如果动态分配
内存
失败
,将返回一个空指针。在这种情况下,我们可以通过检查返回的指针是否为空来判定分配
内存
是否成功。一种处理
申请
堆
空间
失败
的方法是抛出异常。可以使用 std::bad_alloc 异常类来表示
内存
分配
失败
的情况。 一种处理
申请
堆
空间
失败
的方法是抛出异常。可以使用 std::bad_alloc 异常类来表示
内存
分配
失败
的情况。
malloc
申请
内存
空间
失败
上午在调试自己写的一段代码的过程中,发现malloc函数分配
内存
失败
,仔细梳理了一下自己写的代码,
失败
的malloc操作之前也malloc了两三次,但都是成功的,网 上搜了一下,都提到
失败
的原因可能是因为之前
申请
的
内存
空间
出现越界操作,致使malloc分配
失败
,自己得到了一些启示,回头查看了最近一次malloc
申请
内存
成功后的一些操作,最后调试发现就是最近一次
申请
的
内存
空间
不足,使用越界,最终导
C++ 语言
64,648
社区成员
250,476
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章