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

2023-05-16

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++》。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

判断用new申请内存是否成功 的相关文章

随机推荐

  • C语言-函数指针

    1 函数指针 函数原型 xff1a span class hljs keyword int span span class hljs keyword sum span span class hljs keyword int span a s
  • C语言应用小技巧

    1 求字符串长度 span class hljs preprocessor include lt stdlib h gt span size t span class hljs built in strlen span span class
  • C和指针-编程练习

    第六章 1 查找source字符串中匹配chars字符串中任何字符的第一个字符 xff0c 函数返回一个指向source中第1个匹配所找到的位置的指针 如果source中的所有字符均不匹配 xff0c 返回NULL指针 如果任何一个参数为N
  • Bootloader和BIOS、uboot和grub和bootmgr的区别

    版权声明 xff1a 本文章参考了 Bootloader和BIOS Grub uboot概念 未经作者允许 xff0c 严禁用于商业出版 xff0c 否则追究法律责任 网络转载请注明出处 xff0c 这是对原创者的起码的尊重 xff01 x
  • 医学影像常用名词:

    医学影像处理 xff1a MPR xff1a Multiplanarreconstruction allows images to be created from the original axial plane ineither the
  • MsOS——概述

    自己接触的操作系统也有不少了 xff0c 如RT Thread Cos等 xff0c 这些实时操作系统基本的思想就是围绕任务的调度 更像是一个软件平台 xff0c 提供使用者丰富的软件资源 RT Thread是比较成功的应用于消费类产品的国
  • Pixhawk室内自动控制:参数设置

    Pixhawk室内自动控制 xff1a 参数设置 本文针对使用光流传感器和超声波传感器 xff08 或激光雷达 xff09 的Pixhawk用户 ArduCopter目前 xff08 3 52 xff09 已经能够使用光流传感器提供的位置信
  • python函数--capitalize()方法

    capitalize 方法 描述 Python capitalize 将字符串的第一个字母变成大写 其他字母变小写 语法 capitalize 方法语法 xff1a str capitalize 参数 无 返回值 该方法返回一个首字母大写的
  • c# 接口

    1 接口的特点 接口的定义是指定一组函数成员而不实现成员的引用类型 xff0c 其它类型和接口可以继承接口 定义还是很好理解的 xff0c 但是没有反映特点 xff0c 接口主要有以下特点 xff1a span class token pu
  • 在linux上增加swap交换空间

    在虚拟机里面安装oracle11g grid时 发现之前分配的swap交换空间不满足oracke gi安装的最低要求 xff0c 因为我分配的物理内存是8G xff0c 那么就按照要求需要8 12G的swap交换空间 xff0c 而我分配的
  • Elasticsearch7.6.1安装报错及解决过程

    Windows环境Elasticsearch7 6 1安装报错及解决过程 Elasticsearch是一个基于Lucene的搜索服务器 第一次安装ES7 6 1 xff0c 过程中遇到了一些报错 xff0c 把解决方法列出来 xff0c 总
  • 我的 Ubuntu 装机必备软件

    文章目录 我的 Ubuntu 装机必备软件Ubuntu的安装u盘制作添加中科大镜像源NVIDIA显卡驱动的安装卸载旧显卡驱动 安装sogou输入法下载安装配置 安装gitROS kinetic installationgoogle chro
  • GCC源码分析(十三) — 机器描述文件

    版权声明 xff1a 本文为CSDN博主 ashimida 64 的原创文章 xff0c 遵循CC 4 0 BY SA版权协议 xff0c 转载请附上原文出处链接及本声明 原文链接 xff1a https blog csdn net lid
  • VNC登录报错too many security failures解决方法

    桌面进程编号为1 xff0c 可以通过使用 sudo vncserver kill 1 sudo vncserver 1 杀掉并重启解决
  • tensorflow模型保存、读取与可训练参数提取

    一 保存 读取说明 我们创建好模型之后需要保存模型 xff0c 以方便后续对模型的读取与调用 xff0c 保存模型我们可能有下面三种需求 xff1a 1 只保存模型权重参数 xff1b 2 同时保存模型图结构与权重参数 xff1b 3 在训
  • pytorch------cpu与gpu load时相互转化 torch.load(map_location=)

    将gpu改为cpu时 xff0c 遇到一个报错 xff1a RuntimeError Attempting to deserialize object on a CUDA device but torch cuda is available
  • 优化OpenCV视频的读取速度

    我们使用Opencv读取视频时 xff0c 常规的做法是使用read 函数逐帧读取 xff0c 如 code import cv2 cap 61 cv2 VideoCapture 34 test mp4 34 while True read
  • 图像信噪比SNR求解

    xff08 xff08 通常也采用图像信号与噪声的方差之比来近似估计图像的信噪比 xff09 xff09 利用OpenCV计算灰度图像的峰值信噪比 xff08 PSNR xff09 计算两灰度图像之间的峰值信噪比 cpp view plai
  • Jetson TX1启动自带的摄像头

    最近在使用NVIDIA的Jetson TX1开发板 xff0c 并对开发板上自带的摄像头进行了测试 xff0c 下面将测试过程中所使用的一些指令做一些记录 xff0c 在终端上输入 xff1a nvgstcapture 1 0即可打开板子上
  • 判断用new申请内存是否成功

    c 43 43 申请大的内存空间 xff08 如何判断失败 xff09 我想用new申请一个特别大的空间 xff08 多大都可以 xff09 xff0c 主要是我不能判断到底是成功还是失败 假如我这样写 int p i 61 new int