ZeroMemory

ZeroMemory() ZeroMemory宏用0来填充一块内存区域。

  为了避免优化编译器的意外的影响,请使用SecureZeroMemory函数。

  void ZeroMemory(

  PVOID Destination,

  SIZE_T Length

  );

  参数:

  Destination :指向一块准备用0来填充的内存区域的开始地址。

  Length :准备用0来填充的内存区域的大小,按字节来计算。

  返回值:无

  ZeroMemory 只是将指定的内存块清零.

  使用结构前清零, 而不让结构的成员数值具有不确定性, 是一个好的编程习惯

  备注:

  这个函数被定义为RtlZeroMemory宏。至于更多信息,请查看Winbase.h与Winnt.h这两个头文件。

 

 

为什么Microsoft code sample倾向使用ZeroMemory而不是{0}?

 

这是最近看的一片短文的title,当时就很好奇。
经 常查阅MSDN的程序员都会有这个印象,微软code sample中常见的是ZeroMemory,而不是语言提供的“{0}”清零功能(不过,我一直也没有问个why)。c++语法中声明对数组或纯结构 (struct),可以使用例如SPerson sTest = {0}; 来将所有成员置0.

那篇文章的解释是,Microsoft使用ZeroMemory会更clear,因为“= {0}” 这样的语法有些生僻,不是所有人都可以一下子明白。

实际上,两者还是有一些区别。
其一,ZeroMemory会将结构所有字节置0,而={0}只会将成员置0,其中padding字节不变。

其二,但一个struct有构造函数或虚函数时,ZeroMemory可以,而={0}会编译不过。显然,后者起到了一些保护作用,因为对一个有虚 函数的对象使用ZeroMemory时,会将其虚函数的指针置0,这是非常危险的,因为调用虚函数时,程序显然会crash。参看如下代码:

struct SPerson
{
    
//SPerson(){     }
    char c;
    
float s;
}
;

class CTestVirtual
{
public:
     CTestVirtual()
    
{
     }


    
virtual int Draw()
    
{
        
return 10;
     }


    
int a;
}
;

void Test()
{
    
char sztmp[20];
     ZeroMemory(sztmp,
sizeof(sztmp));

     SPerson sTest
= {0};
    
int i = sizeof(SPerson);

    
//CTestVirtual otv = {0};    //Compire error
     CTestVirtual tv;
     ZeroMemory(
&tv, sizeof(tv));
     tv.Draw();        
//As it is an object, don't use the virtual function pointer, so don't crash.
     CTestVirtual *pTv = &tv;
     pTv
->Draw();    //Crash!!!
}


因此,在windows平台下,对于数组或纯结构使用ZeroMemory是安全的,对于class,则使用构造函数,不要调用ZeroMemory。如果有跨平台要求,使用={0}则可以减少一些工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guchuanlong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值