判断用new申请内存是否成功

来源:互联网 发布:金融互助平台源码下载 编辑:程序博客网 时间:2024/06/05 17:43

c++申请大的内存空间(如何判断失败)
我想用new申请一个特别大的空间(多大都可以),主要是我不能判断到底是成功还是失败
假如我这样写 int *p_i=new int[1024*1024*1024];
网上说判断p是否为null
可我写了判断不出来啊
但是确实失败了
p[i]=xxxx;
系统就报错
解答:
LZ不用试了,肯定失败。你想想一个int是4个字节。1024*1024*1024个就是4GB。Windows每个进程的私有的虚拟内存空间大小就只有4GB。你要是都分配了,别的程序代码放哪里啊。
你最好现实一些,一般性能考虑不要一次分配超过50%的内存。而且超过5MB以上的大块内存最好不要用new,因为它会在堆里分配,堆适合小的零碎数据。大块内存请用VirtualAlloc()直接向OS申请。  


char* p=NULL;//最好初始化为NULL

p = new char[nSize];  //申请成功的话,p中会存储一段地址值,也就是p非空
if(p == NULL)
exit();
....
delete[] p;

p = NULL; //删除后马上赋值为NULL  


这种问题在任何程序中都会碰到,就看你的设计了。显然线程之间共享的内存地址,用参数传递显然是错误的方法(不光是内存地址、句柄,任何共享变量都有类似问题),不要不舍得用全局变量,这样大家说的在delete之后把指针变量、或句柄=null,就成立了。(注:被delete的指针变量,"其值不变",当然不会自己变值了,自己赋一个null值是责任/义务,haha... )



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

0 0
原创粉丝点击