当前位置: 首页 > article >正文

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

加个前提:本文对应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在一定的编译优化条件下,使用ZeroMemory0以后的内存块如果再也不被引用,ZeroMemory有可能会被优化掉而不执行。如果这块内存里存储的是用户的密码、加解密算法的密钥等敏感信息,就存在被黑客偷窥的可能。而SecurZeroMemory在任何条件下都不会被优化掉,所以在销毁内存块中储敏感数据时或者释放存有敏感数据的内存块前应使用SecurZeroMemory,而不是ZeroMemory

 

至于"={ 0 }"的形式,尽量不要使用,不够直观。而且在内存对齐方面也存在一定问题。有兴趣的朋友可以参考Raymond ChenWhy 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/ 到现在依然非常活跃。

http://www.lryc.cn/news/2414100.html

相关文章:

  • vlan的基本配置
  • LEETCODE-DAY27
  • 创建个人网站(一) 如何申请一个网站
  • 电脑蓝屏显示0x000000f4怎么办的四个解决方法
  • Class类的newInstance方法抛出InstantiationException异常
  • js中prompt()的用法
  • C语言socket编程----实现TCP通信
  • 【C语言】常见面笔试题(10道)
  • 全景图像拼接
  • 关于led电源设计
  • c++中静态函数与动态函数的区别
  • 深度学习(四)卷积神经网络-卷积神经网络(3) -Andrew Ng
  • sockaddr和sockaddr_in的区别
  • printf输出格式
  • 167.Web前端网页制作 大气的UI设计平台网页实例 大学生期末大作业
  • Cache(三):cache的常见名词与Cache一致性问题简介
  • mysql安装程序错误代码2503,Win10安装程序错误2502/2503的解决方法
  • CompareNoCase与Compare
  • matlab函数imfilter和 opencv中filter2D函数的对应关系
  • Windows 开机启动 | 启动项管理
  • 在IOS中使用AVPlayer去播放在线音频文件,并设置音量
  • 有道翻译接口逆向_python有道翻译api(2)
  • JSP基于web2.0的超市商品管理系统3sq6z程序+源码+数据库+调试部署+开发环境
  • 【学习资源】C#初学者学习资源推荐
  • Rosetta Tutorial 5/7/9 翻译 | 主要为 Scoring Packer Tutorial 部分
  • MPEG TS流简介
  • 云计算比赛私有云题目
  • git创建分支,提交分支,删除分支的开发流程
  • Spring 自动定时任务配置
  • 【JavaScript】用于模拟 word 生成网页页面的插件