最近在修改程序问题时,发现一个用ZeroMemory的使用问题。ZeroMemory、memset或 “={0}”来对结构体对象进行初始化或清零。然而这三种方式都有各自的特点,使用时需谨慎,否则容易出现严重错误。

ZeroMemory是美国微软公司的软件开发包SDK中的一个宏。 其作用是用0来填充一块内存区域。定义式如下:

#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
#define ZeroMemory RtlZeroMemory

memset的原型是:

void *memset(void *s,int ch,size_t n); 是由C Run-time Library提供的提供的函数,作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。由于是语言层面提供,所以可跨平台使用。参考:
       http://www.cplusplus.com/reference/cstring/memset/

可见,ZeroMemory实际是用memset实现的,而且只用于Windows平台。ZeroMemory和memset且于清零时,会将结构中所有字节置0,如果结构体中有虚函数或结构体成员中有虚函数,则会将虚函数指针置0,如果后续程序调用虚函数,空指针很可能导致程序崩溃!

因此,有虚函数或成员中有虚函数的结构体初始化,一定要用构造函数来完成。

ZeroMemory、memset 和“={0}” 用于清零操作的区别相关推荐

  1. ZeroMemory、memset 和 “={0}” 三者用于清零操作的区别

    ZeroMemory . memset   和 "={0}" 三者用于清零操作的区别: 首先是ZeroMemory和memset的区别: 1.ZeroMemory是微软的SDK提供 ...

  2. 打印机清零操作步骤分享!

    打印机怎么清零?打印机在使用一段时间过后,可能会留下很多打印记录和缓存,影响正常使用,这时候就要对它实行清零操作了.那么打印机怎么清零呢,其实不同品牌不太一样. 方法一: 1.首先我们打开打印机的前盖 ...

  3. 8位寄存器置位与清零操作

    对寄存器A的第四位进行置位操作,1<<4, A=A|(1<<4). 对寄存器A的第四位进行清零操作,1<<4,A=A&~(1<<4). 置位与清 ...

  4. 对结构体变量进行清零操作

    自己为了省事,往往习惯对结构体变量清零时,直接在定义时赋值,比如如下: struct tls_cmd_key_t {     u8 format;     u8 index;     u8 key_l ...

  5. 8.裸板--C语言下的寄存器的读写置位清零操作

    从CPU的角度来看,外设的寄存器跟通用寄存器操作一样,对它们的地址进行读写移位等操作即可进行配置读取写入等动作. 通用寄存器有15个 寄存器名字 Reg# APCS 意义 R0 a1 工作寄存器 R1 ...

  6. 同步电路出现异步清零可以吗_异步清零和同步清零置数区别

    [相关知识]:中规模集成计数器的功能表阅读.反馈清零法和反馈置数法的应用等.本文引用地址:http://www.eepw.com.cn/article/201610/311031.htm [解题方法] ...

  7. ZeroMemory、memset 和 “={0}” 三者区别

    ZeroMemory.memset 和 "={0}" 三者用于清零操作的区别: 首先是ZeroMemory和memset的区别: 1.ZeroMemory是微软的SDK提供的,me ...

  8. ZeroMemory、memset 和 “={0}”的联系与区别

    ZeroMemory.memset 和 "={0}" 三者用于清零操作的区别: 首先是ZeroMemory和memset的区别: 1.ZeroMemory是微软的SDK提供的,me ...

  9. Zeromemory memset

    1. void ZeroMemory( PVOID Destination, SIZE_T Length); Destination :指向一块准备用0来填充的内存区域的开始地址. Length :准 ...

最新文章

  1. INSTALL_FAILED_VERSION_DOWNGRADE
  2. Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明
  3. python-mysql的安装和基本操作
  4. 一个由进程内存布局异常引起的问题
  5. Server-Side UI Automation Provider - WinForm Sample
  6. python数据结构与算法(13)
  7. argparse--解析命令行选项、用法以及说明
  8. spring—SpringMVC的请求和响应
  9. hill密码源代码c语言,古典密码(Hill加密算法)(示例代码)
  10. CSS3 盒阴影 box-shadow属性
  11. linux内核发包工具,Linux内核发包工具pktgen测试方案说明
  12. CAT - 监控平台之装配篇
  13. activiti7关联mysql_学习笔记:一个MySQL实例有多个Activiti数据库问题
  14. 看雪学院荣获TSRC 2018年度峰会优秀合作伙伴
  15. vscode中自动修复eslint的项目语法错误
  16. oracle双机热备份方法(转)
  17. GIS地图布局设置总结
  18. 看门狗性能软件测试,《看门狗:军团》PC版性能表现分析
  19. 【零信任落地案例】吉大正元某大型集团公司零信任实践案例
  20. Octapharma Group公布强劲的2018年业绩

热门文章

  1. Struts2用AbstractInterceptor取代了AroundInterceptor
  2. 微信小程序中获取用户微信运动信息
  3. linux 解压rar文件
  4. 地图开发是怎么应用起来的?哪里去找地图开发服务?
  5. Wordpress ThickBox 特效修改:添加“查看原图”
  6. 【公有云相关概念和应用场景-6】什么是DNS 域名系统
  7. for each 的用法
  8. js 关于动态添加class样式的学习
  9. linux程序多人聊天室,【linux】多人聊天室实现
  10. 刘韧:智能手机投喂让笨人更笨了