ZeroMemory、memset和 “={0}” 区别.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ZeroMemory,是美国 HYPERLINK /view/2353.htm \t _blank 微软公司的软件开发包 HYPERLINK /view/429424.htm \t _blank SDK中的一个 HYPERLINK /view/57.htm \t _blank 宏。 其作用,是用0来填充一块 HYPERLINK /view/1082.htm \t _blank 内存区域。 void ZeroMemory( PVOID Destination,SIZE_T Length ); Destination :指向一块准备用0来填充的内存区域的开始地址。 Length :准备用0来填充的内存区域的大小,按 HYPERLINK /view/60408.htm \t _blank 字节来计算。 ZeroMemory只是将指定的内存块清零。使用结构前清零,而不让结构的成员数值具有不确定性,是一个好的 HYPERLINK /view/3281.htm \t _blank 编程习惯。 为了避免优化 HYPERLINK /view/487018.htm \t _blank 编译器的意外的影响,请使用SecureZeroMemory HYPERLINK /view/15061.htm \t _blank 函数。这个函数被定义为RtlZeroMemory宏。更新信息,请查看Winbase.h与Winnt.h这两个头文件。 ZeroMemory和memset的区别:   1、ZeroMemory是微软的SDK提供的,memset是属于C Run-time Library提供的。因此ZeroMemory只能用于Windows系统,而memset还可用于其他系统。   2、ZeroMemory是一个宏,只是用于把一段内存的内容置零,内部其实是用 memset实现的,而memset除了对内存进行清零操作,还可以将内存置成别的字符。   3、如果程序是Win32程序而且不想连接c运行时库,就用ZeroMemory;如果需要跨平台,就用memset。   所以,如果ZeroMemory和memset用于清零操作,其本质是一样的。 ZeroMemory和 “={0}”的区别:   1、ZeroMemory会将结构中所有字节置0,而“={0}”只会将成员置0,其中填充字节不变。   2、一个struct有构造函数或虚函数时,ZeroMemory可以编译通过,而“={0}”会产生编译错误。其中,“={0}”的编译错误起到了一定的保护作用,因为对一个有虚函数的对象使用ZeroMemory时,会将其虚函数的指针置0,这是非常危险的(调用虚函数时,空指针很可能引起程序崩溃)。 示例代码   struct SPerson   {char c;float s;};   class CTestVirtual   {public:   CTestVirtual(){}   /// 虚函数   virtual int Draw()   {return 10;}   int a;   };   int main(int argc, char* argv[])   {   char sztmp[20];   /// 安全操作   ZeroMemory(sztmp, sizeof(sztmp));   /// 安全操作   SPerson sTest = {0};   int i = sizeof(SPerson);   //// 会引起编译错误!   //CTestVirtual otv = {0};   CTestVirtual tv;   /// 危险操作!   ZeroMemory(tv, sizeof(tv));   /// 因为对象没有使用虚指针调用函数,所以程序运行到这里不会崩溃   tv.Draw();   /// 将对象地址赋给指针   CTestVirtual *pTv = tv;   //虚函数的指针已经被清零,因此程序运行到这里会引起崩溃!   //错误信息:Unhandled exception at 0x004010b1 in Solution.exe:   //0xC0000005: Access violation reading location 0   pTv-Draw();   return 0;   }   因此,在windows平台下,数组或纯结构使用ZeroMemory是安全的,而类(class)就使用构造函数进行初始化,不要调用ZeroMemory。   另外,如果一个类的结构中包含STL模板(Vector、List、Map等等)

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档