判断用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++》。
- 判断用new申请内存是否成功
- C++new申请内存后的判断和assert()
- 如何判断new的内存是否失败?使用try catch
- new与delete申请内存
- C++ new[] 实际申请内存
- new malloc 内存申请转储
- 动态内存申请 new、delete、delete[]、delete()
- 判断连接数据库是否成功
- //判断数据是否更新成功
- bat 判断数据库是否成功
- 判断数据库是否连接成功
- 判断 android 是否成功联网
- 判断数据库是否登录成功
- 判断命令是否成功执行 .
- 判断android是否成功联网
- 判断ftp是否登录成功
- 判断mvn命令是否成功
- 判断网络是否连接成功
- 乐视小米陷版权混战 多个业务存在竞争关系是主因
- Linux下java程序启动脚本(可做开机自启动Service脚本)
- OCP 1Z0 053 62
- 2维动态数组
- iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
- 判断用new申请内存是否成功
- loadjava报错Java: Not Found Error
- JAVA学习第3篇:实例方法和类方法
- android异步任务
- Cocos2d-X添加快速OBB碰撞检测
- 数学之美系列十六:不要把所有的鸡蛋放在一个篮子里 — 谈谈最大熵模型
- 岁月是一条河,生活就是一叶方舟,而我们是掌控幸福的舵手
- HTML INPUT 只读
- MySQL 数据库中每个表占用的空间大小