new与delete正确用法

2023-05-16

说明:推荐使用如下宏,可以在一定程度上避免使用空指针,野指针的问题。
#define HW_NEW(var, classname) \
    do { \
    try \
{ \
    var = new classname; \
} \
    catch (...) \
{ \
    var = NULL; \
} \
    break; \
    } while(0)

//(1) 该宏会将var置为NULL, 所以调用该宏之后, 不再需要置var为NULL
//(2) HW_DELETE宏与NEW对应, 用来释放由HW_NEW分配的对象
//    注意: 如果以数组方式分配对象(见对HW_NEW的描述), 则必须使用宏HW_DELETE_A
//    来释放, 否则可能导致问题,参见:规则6.3
#define HW_DELETE(var) \
    do \
{ \
    if (var != NULL) \
{ \
    delete var; \
    var = NULL; \
} \
    break; \
} while(NULL == var)

//(1) 这个宏用来删除一个由HW_NEW分配的数组, 删除之后也会将var置为NULL
#define HW_DELETE_A(var) \
    do \
{ \
    if (var != NULL) \
{ \
    delete []var; \
    var = NULL; \
} \
    break; \
} while(NULL == var)
直接使用HW_DELETE,HW_DELETE_A宏来释放指针内存空间,就不会出现遗忘将指针置为NULL了。

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

new与delete正确用法 的相关文章

  • dedecms普通文章栏目改成自定义内容模型办法

    在织梦后台 程序 SQl命令工具 INSERT INTO addon18 aid typeid redirecturl userip body SELECT aid typeid redirecturl userip body FROM a
  • 删除表和截断表命令之间的区别是什么?

    删除表和截断表命令之间的区别是什么 此问题提交于2004年11月23日 表删除包括表的定义和关联对象 规则 索引 约 触发器 主键 等 很明显 一旦表被删除 那么表中包含的所有的数据行都会被一同删除 truncate table 命令则仅仅
  • JavaScript undefined 属性

    定义和用法 undefined 属性用于存放 JavaScript 的 undefined 值 语法 undefined 说明 无法使用 for in 循环来枚举 undefined 属性 也不能用 delete 运算符来删除它 undef
  • C++ std::tr1::shared_ptr使用

    看 effective c 作者一直强调用std tr1 shared ptr 比起auto ptr好多了 shared ptr采用引用计数 多个指针可以指向同一个对象 auto ptr就不能 只能运行一个指针指向一个对象 如果要指针赋值
  • 多表可更新视图的实现

    多表关联后的数据能保证主键唯一的视图是可直接做更新 不需要用触发器实现 多表视图的定义 当视图的数据源只有一张数据表 则该视图为单表视图 当视图的数据源是多张数据表 则该视图为多表视图 可更新视图的定义 在绝大多数人的概念中 视图是只读的
  • Treap树实现文件C语言

    对于这个 想说的是 关于 NullNode 结点 在调用Release 释放内存之后 要将其恢复为NULL 以便下次的连续使用 自己想到的 很不错 treap c treap树实现文件 include treapTree h 全局变量声明定
  • C++沉思录读书笔记1.如何定义一个完整的类

    C 沉思录 Ruminations On C 读书笔记1 如何定义一个完整的类 作者 2006 4 27 12 19 C 哲学 只为用到的东西付出代价 定义一个类时必须搞清楚的几个问题 需要构造函数吗 如果答案为 no 那么很可能你需要定义
  • ASCII表

    http office microsoft com zh cn assistance HA011331362052 aspx ASCII 打印字符 数字 32 126 分配给了能在键盘上找到的字符 当您查看或打印文档时就会出现 数字 127
  • 柯理化、mergeOptions、new的实现原理、reduce、flat

    1 什么是反柯理化 怎么实现 反柯里化 是一个泛型化的过程 它使得被反柯里化的函数 可以接收更多参数 Function prototype unCurrying function var that this return function
  • C++深拷贝和浅拷贝

    C 深拷贝 浅拷贝 对于普通类型的对象来说 它们之间的复制是很简单的 例如 int a 88 int b a 而类对象与普通对象不同 类对象内部结构一般较为复杂 存在各种成员变量 下面看一个类对象拷贝的简单例子 include
  • c++中,什么时候用 A a;和什么时候用A a=new A;

    说明 此处内容是在网上摘抄的 总结一下 为了以后查找方面 new是在堆上分配内存 它需要用delete释放 否则会造成内存泄漏 使用的内存没有即时释放 造成内存的浪费 而A a在右大括号执行后 会自动释放内存 如 int main A a
  • js中new 到底做了瓦特??比较new、Object.create、Object.setPrototypeOf

    实例化的时候我们都是这样 var box new BOX 那么new在中间有什么作用呢 new 先创建一个新对象b new Object 将构造函数作用域赋给新变量 b proto BOX prototype 执行构造函数中的代码 属性 方
  • VC 根据域名获取IP

    include Winsock2 h pragma comment lib Ws2 32 lib 注意字符串需以 0结尾 例如 lpzSeverName www baidu com 0 bool WINAPI Domain2IP char
  • C++模板特例化

    模板是用来写一些独立化特定类型的代码 但是对于有些类型 在处理时 细节上却有所差别 常见的如char 如 现在你打算写一个栈 可以用于任何数据类型 那你肯定首先想到的就是模板啦 template
  • C++设计日志:读写定界符文件

    C 设计日志 读写定界符文件 荣耀 2003 我将撰写的 C 设计实践 系列文章 会讲到一些数据处理系统设计方法 我并不希望文章局限于特定数据库产品 我也不喜欢空对空地讲述太多抽象道理 我必须编写一些模拟数据库操作的代码 用于读写定界符文件
  • 关于C++对象模型(下)

    下篇主要讨论调用成员函数 访问成员变量的开销 及其特殊成员函数 数组 异常处理的讨论 这篇文章中出现的对象定义都出现在上篇中 全文在这里下载 文章内容转自 http tb blog csdn net TrackBack aspx PostI
  • 20个常见的Java错误以及规避方法

    原文 50 Common Java Errors and How to Avoid Them Part 1 作者 Angela Stringfellow 翻译 雁惊寒 译者注 本文介绍了20个常见的Java编译器错误 每种错误都包含了代码片
  • delete LEFT JOIN 的一个问题解决办法

    LEFT JOIN 的一个问题解决办法 今天在一个程序后台删除一个东西的时候 却出现了这个问题 Java代码 System Message MySQL Query Error User admin Time 2007 10 20 21 08
  • 如何正确的关闭 MFC 线程

    前言 近日在网上看到很多人问及如何关闭一下线程 但是我看网上给出的并不详细 而且有些方法还是错误的 小弟在此拙作一篇 不谈别的 只谈及如何正确的关闭MFC的线程 至于Win32和C RunTime的线程暂不涉及 一 关于MFC的线程 MFC
  • C++ primer智能指针(HasPtr)实现

    智能指针显然是C 吸引人的地方之一 必须掌握 看了 C primer 里面着重讲了智能指针的实现方式 书中说到 HasPtr 注 就是自定义的智能指针 在其它方面的行为与普通指针一致 具体而言 复制对象时 副本和原对象将指向同一基础对象 如

随机推荐

  • 结构体占用的存储空间计算

    原文链接 xff1a https www cnblogs com lykbk archive 2013 04 02 krtmbhrkhoirtj9468945 html 结构体大小的计算 用最简单的方法 xff0c 通俗易懂的方法计算结构体
  • 基于rtthread的OTA功能实现

    基于rtthread的OTA功能实现 关键字 xff1a RT Thread OTA IAP Ymodem HTTP OTA FAL Qboot 打包 压缩 加密 软件环境 RT Thread Studio 版本 2 2 5编译器 GNU
  • 百度2014校园招聘笔试题(武汉站 9.28)

    一 简答题 xff08 本题共30分 xff09 动态链接库与静态链接库分别有什么优缺点 xff1f xff08 10分 xff09 轮训任务调度和抢占式任务调度有什么区别 xff1f xff08 10分 xff09 请列出数据库中常用的锁
  • APM代码中MAVLINK的初步分析。

    最近在看APM代码中的MAVLINK部分 这里记录下一些分析结果 xff0c 有同样看这部分的同志请一起把这部分知识补全 首先在MAVLink 的主要功能是通过在ArduCopter cpp中的三个 任务 完成的 SCHED TASK gc
  • 求字符串中的最长回文子串

    方法一 xff08 暴力法 xff09 xff1a include lt stdio h gt include lt string h gt bool Palindrome const char str int start int end
  • 堆和栈访问效率哪个更高

    1 栈分配的软件优势 xff1a 栈分配算法简单 xff0c 所以高效 xff1b 堆分配算法相对比较复杂 栈分配的硬件优势 xff1a 主要两点 xff0c cache和内存映射 如果在 栈上分配小块内存 xff0c 因为cache和内存
  • C++ Primer学习-第15章 面向对象编程

    15 1 面向对象编程 xff1a 概述 在C 43 43 中 xff0c 基类必须指出希望派生类重新定义那些函数 xff0c 定义为virtual的函数是基类期待派生类重新定义的 xff0c 基类希望派生类继承的函数不能定义为学虚函数 1
  • Ubuntu18.04创建工作空间和功能包

    由于本人记性实在不好 xff0c 每次新建工作空间和功能包的时候都要重新百度 xff0c 因此就以这种方式记下来 xff0c 有错误的地方还请批评指正 1 创建工作空间catkin ws mkdir p catkin ws src 2 初始
  • 关于安装双系统Linux不能完整分区解决方法

    在我安装双系统win7 43 ubuntu 16 x x版本时 xff0c ubuntu 在安装过程中会检测到win7 系统磁盘使用情况 将ubuntu 安装在空闲硬盘位置时 xff0c 系统设置不能有4 个主分区 xff0c 所以在分区过
  • 彻底删除VM虚拟机手把手详细教学

    一 在彻底删除VMware之前我们应在服务中把VM的任务和进程全部中止 1 我们首先按windows键 输入 服务 我们打开服务 2 在服务中我们找到vm开头的服务 并右键停止这些服务 3 按ctrl 43 alt 43 del选择任务管理
  • Leetcode 常用函数总结(C语言版本)

    include lt stdio h gt include lt stdbool h gt include lt math h gt include lt ctype h gt include lt string h gt include
  • C++ map表的应用

    map表可以存储数据对应关系 include lt map gt include lt string gt include lt iostream gt using namespace std int main map lt int str
  • C++判断是否是IP地址

    判断是否是IP地址 bool isIPAddress const char s const char pChar bool rv 61 true int tmp1 tmp2 tmp3 tmp4 i while 1 i 61 sscanf s
  • ARDUSUB 浏览

    ArduSub is an advanced open source ROV AUV control system Overview ArduSub水下机器人的控制器是一个完整的开源解决方案 提供远程操作控制 通过智能潜水模式 和全自动的执
  • C++判断是否是纯数字

    C 43 43 判断是否是纯数字 bool isDigitStr const char cstr if NULL 61 61 cstr cstr 0 61 61 0 return false int len 61 strlen cstr i
  • 命里有时终须有,命里无时莫强求

    命里有时终须有 xff0c 命里无时莫强求 今天是2012年2月24号 xff0c 和我谈了3个多月的女生突然之间说我们之间不合适 xff0c 让我以后不要再去骚扰她 真心第一次体会到失恋的感觉 xff0c 同时打电话给我姐姐诉说了下 xf
  • 共享内存--函数

    共享内存允许两个不相关的进程访问同一个逻辑内存 共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式 大多数的共享内存的具体实现 xff0c 都把由不同进程之间共享的内存安排为同一段物理内存 共享内存是由IPC为进程创建的一个特殊
  • assert用法

    判断是否为真 include 34 stdio h 34 include lt string h gt include lt stdlib h gt define NDEBUG include lt assert h gt void mai
  • strcpy原型

    已知strcpy 函数的原型是 char strcpy char strDest const char strSrc 其中strDest 是目的字符串 xff0c strSrc 是源字符串 xff08 1 xff09 不调用C 43 43
  • new与delete正确用法

    说明 xff1a 推荐使用如下宏 xff0c 可以在一定程度上避免使用空指针 xff0c 野指针的问题 define HW NEW var classname do try var 61 new classname catch var 61