读书人

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

发布时间: 2012-03-27 13:44:24 作者: rapoo

c++申请大的内存空间(如何判断失败)
我想用new申请一个特别大的空间(多大都可以),主要是我不能判断到底是成功还是失败
假如我这样写 int *p_i=new int[1024*1024*1024];
网上说判断p是否为null
可我写了判断不出来啊
但是确实失败了
p[i]=xxxx;
系统就报错
各位大侠帮忙 只要我能判断 哪怕一个人回的 只要解决了 分全给你 在线等

[解决办法]
用new分配这么大的内存根本没有意义。默认windows堆大小是 1M
[解决办法]
LZ内存分配的太大了
[解决办法]
标准C++用抛出异常来处理new内存分配失败的问题,所以你可以这样写:
try
{
int *p_i=new int[1024*1024*1024];
}
catch(bad_alloc &memExp)
{
// 失败以后,要么 abort 要么重分配
cerr<<memExp.what()<<endl;
}
如果分配失败了,程序就跳过之后的代码,输出错误信息。
更具体的可以参考《Effective c++》。


[解决办法]
#include <iostream>
using namespace std;
int main()
{
int* p=new int[1024*1024];
if (NULL!=p) {
p[0]=1;
} else {
cout<<"指针未申请成功"<<endl;
}
}这样就可以
[解决办法]

探讨
标准C++用抛出异常来处理new内存分配失败的问题,所以你可以这样写:
try
{
int *p_i=new int[1024*1024*1024];
}
catch(bad_alloc &memExp)
{
// 失败以后,要么 abort 要么重分配
cerr<<memExp.what()<<endl;
}
如果分配失败了,程序就跳过之后的……

[解决办法]
用异常来判断
[解决办法]
LZ不用试了,肯定失败。你想想一个int是4个字节。1024*1024*1024个就是4GB。Windows每个进程的私有的虚拟内存空间大小就只有4GB。你要是都分配了,别的程序代码放哪里啊。
你最好现实一些,一般性能考虑不要一次分配超过50%的内存。而且超过5MB以上的大块内存最好不要用new,因为它会在堆里分配,堆适合小的零碎数据。大块内存请用VirtualAlloc()直接向OS申请。
[解决办法]
null那是针对malloc的。new的话可以捕捉异常。而你要做的是避免这样大的内存分配。

读书人网 >C++

热点推荐