首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-27 
c++申请大的内存空间(如何判断失败)我想用new申请一个特别大的空间(多大都可以),主要是我不能判断到底是成

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 &amp;memExp)
{
// 失败以后,要么 abort 要么重分配
cerr<<memExp.what()<<endl;
}
如果分配失败了,程序就跳过之后的……

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

热点排行