加个前提:本文对应Windows下编程环境。

简而言之:一般情况,如初始化内存块的时候,用ZeroMemory。销毁内存块中储敏感数据时或者释放存有敏感数据(比如密码,密钥等)的内存块前应使用使用SecurZeroMemory。如无特殊原因不使用“={ 0 }”。

使用memset函数将内存块置0是完全没有问题。memset的好处是跨平台比较容易,可是C/C++跨平台就是梦魇。在使用memset的时候有个小地方需要注意,W.Richard Stevens在《UNIX网络编程》中提到void *memset(void *dest, int c, size_t count)的后两个参数容易写反,而且在编译时无法发现。

ZeroMemory宏,在底层就是由memset实现的。只是ZeroMemory易读性更好,更加健壮。或者说看起来更cool、更professional。在微软平台下的程序,推荐使用ZeroMemory。

SecurZeroMemory函数,可以看作是在安全方面加强版的ZeroMemory。细心的读者是否注意到ZeroMemory是宏,而SecurZeroMemory是函数?ZeroMemory在一定的编译优化条件下,使用ZeroMemory置0以后的内存块如果再也不被引用,ZeroMemory有可能会被“优化”掉而不执行。如果这块内存里存储的是用户的密码、加解密算法的密钥等敏感信息,就存在被黑客偷窥的可能。而SecurZeroMemory在任何条件下都不会被“优化”掉,所以在销毁内存块中储敏感数据时或者释放存有敏感数据的内存块前应使用SecurZeroMemory,而不是ZeroMemory。

至于"={ 0 }"的形式,尽量不要使用,不够直观。而且在内存对齐方面也存在一定问题。有兴趣的朋友可以参考Raymond Chen的《Why do Microsoft code samples tend to use ZeroMemory instead of { 0 }?》

顺便提一句,Raymond Chen可不是一般的人物,他是Windows组元老级人物,著有The old new thing一书,对Windows的技术历史和原理感兴趣的朋友可以一读。他的Blog: http://blogs.msdn.com/b/oldnewthing/ 到现在依然非常活跃。

==============================The End==============================

C++中内存块置0的三种方法:memset, ZeroMemory和SecurZeroMemory相关推荐

  1. 在HTML中使用CSS美化网页的三种方法

    在HTML中使用CSS美化网页的三种方法 CSS是Cascading Style Sheets(级联样式表)的缩写,CSS是一种样式表语言,用于为HTML文档定义布局.例如,CSS涉及字体.颜色.边距 ...

  2. 安卓在子线程中实现更新UI界面的三种方法 Handler+Message、runOnUiThread、控件.post()

    1.说明 安卓中UI线程为主线程,更新UI界面必须在主线程中进行,在子线程中实现更新UI界面的三种方法:Handler.RunOnUiThread.控件.post() 2.1 Handler (1)定 ...

  3. Unity3D中的SendMessage使用(消息传递的三种方法)

    转载自 Unity3D中的SendMessage使用(消息传递的三种方法) 0 概述 Unity提供的消息推送机制可以非常方便我们的脚本开发,它实现的是一种 伪监听者模式,利用的是反射机制. 1 常用 ...

  4. js中当等于最小值是让代码不执行_网页中JS函数自动执行常用三种方法

    本文为大家分享了在网页中JS函数自动执行常用方法,供大家参考,具体内容如下 一.JS方法 1.最简单的调用方式,直接写到html的body标签里面: 2.在JS语句调用: function myfun ...

  5. ABAP中创建动态内表的三种方法(转载)

    BAP中创建动态内表的三种方法 第一种: 如果我们需要的动态内表字段或者动态工作区和数据字典中的类型一致,可以直接使用CREATE DATA生成,当然也可以是自定义类型. 比如要产生和数据表MARA结 ...

  6. android启动其他app的服务器,Android中通过外部程序启动App的三种方法

    这篇文章主要介绍了Android中通过外部程序启动App的三种方法, 本文讲解了直接通过包名. 通过自定义的Action. 通过Scheme三种方法,并分别给出操作代码,需要的朋友可以参考下 ==== ...

  7. vbs执行ctrl+空格_VBS中解决路径带空格的三种方法

    vbs中,如果需要运行的程序中带有空格,按照通常的方式往往会提示错误,其实有两种形式不同的解决方法: 在应用程序前后分别加三个双引号,代码如下: Set wshell=CreateObject(&qu ...

  8. html网页自动运行函数,在网页中JS函数自动执行常用三种方法

    在网页中JS函数自动执行常用三种方法 在HTML中的Head区域中,有如下函数: functionn MyAutoRun() { //以下是您的函数的代码,请自行修改先! alert("函数 ...

  9. C/C++中关于交换(Swap)函数的三种方法

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 一.交换函数的说明 二.三种情况的说明 1.值传递 1.1值传递的运行结果 2.传址调用 运行结果: 3.引用作 ...

最新文章

  1. CCNP路由实验---3、人工汇总EIGRP路由
  2. mysql性能的介绍少_MySQL性能突然下降怎么回事 MySQL性能突然下降原因介绍
  3. UNIX中的文件控制--fcntl()
  4. 2017-2018-1 20155222 《信息安全系统设计基础》第10周 Linux下的IPC机制
  5. BZOJ3945 : 无聊的邮递员
  6. 怎么用class引入svg_【蓝湖指北】走向设计巅峰,从蓝湖 Sketch 插件开始,用它!...
  7. matlab硬接触,abaqus中的关于硬接触(Hard contact)、及其他接触
  8. boost::math模块使用逆高斯(或逆正态)分布的示例
  9. 快看Sample代码,速学Swift语言(3)-运算符
  10. FM,FFM及其实现
  11. 傅里叶变换频谱的可视化保存
  12. Ajax(从json中提取数据)
  13. UnicodeDecodeError: 'utf8' codec can't decode byte 0xd1 in position 0: invalid continuation byte问题
  14. 你知道谷歌有个社区叫 GBG 么?
  15. PullToRefresh使用详解(四)--利用回调函数实现到底加载
  16. Go基础-go语言的编码规范
  17. mysql数据库教程子查询_MySQL数据库实操教程(17)——子查询
  18. 软文外链-软文外链发布软件-软文外链发布工具
  19. 【xlsx-chart】Vue项目中导出Excel表格并带上图表
  20. gitter 卸载_最佳Gitter频道:Rust

热门文章

  1. 性能测试流程-性能测试2
  2. 什么是SpringMVC?SpringMVC之hello.jsp实现过程 问题:SpringMVC在JSP页面取不到ModelAndView中的值(已解决)
  3. js数据类型强制转换--转换为String
  4. ES索引创建、新增与修改字段
  5. python marshal loads failed_Python模块学习:marshal 对象的序列化
  6. - Statement
  7. PT_二维随机变量:正态分布的可加性/一维随机变量函数与正态分布
  8. 关于mac地址,请各位大侠帮忙解决
  9. 服务器ssh升级导致的java程序ssh连接失败
  10. PyGame|给程序插入背景音乐