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

首先是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 0x00000000.
   pTv->Draw();

return 0;
}

因此,在windows平台下,数组或纯结构使用ZeroMemory是安全的,而类(class)就使用构造函数进行初始化,不要调用ZeroMemory。

另外,如果一个类的结构中包含STL模板(Vector、List、Map等等),那么使用ZeroMemory对这个类的对象中进行清零操作也会引起一系列的崩溃问题(指针指向内存错误、迭代器越界访问等)。
所以,再次强烈建议:类(class)只使用构造函数进行初始化,不要调用ZeroMemory进行清零操作。

转贴自:http://hi.baidu.com/sa_space/blog/item/cf99aac72e5232d6d10060b5.html

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

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

    最近在修改程序问题时,发现一个用ZeroMemory的使用问题.ZeroMemory.memset或 "={0}"来对结构体对象进行初始化或清零.然而这三种方式都有各自的特点,使用 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. C++基础之:memset 、ZeroMemory和 “={0}” 三者区别及危险需慎用

    memset是以字节为单位,初始化内存块. 当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值, 比如 char data[10]; memset(data, 1, ...

最新文章

  1. C#利用Graphics类绘制进阶--实现图片等比例缩放
  2. 【每日一题】502. IPO
  3. mysql bin log日志
  4. 无人机自动悬停的实现方法
  5. red flag linux指定域名,Red Flag Server 4.1 系统管理手册(适用桌面linux4.1) 6
  6. Java 8 流API(Stream)介绍与示例
  7. 大数据实战之环境搭建(十)
  8. 使用Blend开发Silverlight VSM
  9. springboot 配置文件-yaml的用法
  10. C# 编译或者解释?
  11. Notepad++使用心得和特色功能介绍
  12. 苹果手机解压缩软件_「 神器 」用得贼舒服的压缩/解压缩工具
  13. 图像入门:MATLAB图像识别
  14. 用vlookup函数就能判断你的Excel水平处于几段
  15. 删除wmspdmv监控进程-- 背后的眼睛
  16. 打卡赠书 | 养成一个思考习惯
  17. 遍历HashMap的几种常用方法
  18. linux内核编译最详细,Linux内核编译详细教程,linux内核编译
  19. AD19学习笔记之原理图的绘制
  20. vsm java_vsm向量空间模型java实现(源码)

热门文章

  1. 《细胞》重磅!科学家成功培育全球首个人类自组织心脏类器官,可自主跳动且能自我修复...
  2. 对CAN/CAN-FD/ETH/Camera同步采集的数据采集工具软件
  3. CH334U与FE1.1S功能对比
  4. 用户存续期价值评估(CLV) 一
  5. HAL库串口中断RX中的Overrun Error问题
  6. 使用parted 对大容量盘进行分区
  7. 数据结构:图:AOV网和AOE网
  8. 中国传统文化常识集锦[转]
  9. 《企业私有云建设指南》新书出版
  10. 搭建OpenStack多节点的企业私有云平台——基础基础环境搭建