ZeroMemory、memset 和 “={0}” 三者用于清零操作的区别
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}” 三者用于清零操作的区别相关推荐
- ZeroMemory、memset 和“={0}” 用于清零操作的区别
最近在修改程序问题时,发现一个用ZeroMemory的使用问题.ZeroMemory.memset或 "={0}"来对结构体对象进行初始化或清零.然而这三种方式都有各自的特点,使用 ...
- ZeroMemory、memset 和 “={0}” 三者区别
ZeroMemory.memset 和 "={0}" 三者用于清零操作的区别: 首先是ZeroMemory和memset的区别: 1.ZeroMemory是微软的SDK提供的,me ...
- 打印机清零操作步骤分享!
打印机怎么清零?打印机在使用一段时间过后,可能会留下很多打印记录和缓存,影响正常使用,这时候就要对它实行清零操作了.那么打印机怎么清零呢,其实不同品牌不太一样. 方法一: 1.首先我们打开打印机的前盖 ...
- 8位寄存器置位与清零操作
对寄存器A的第四位进行置位操作,1<<4, A=A|(1<<4). 对寄存器A的第四位进行清零操作,1<<4,A=A&~(1<<4). 置位与清 ...
- 对结构体变量进行清零操作
自己为了省事,往往习惯对结构体变量清零时,直接在定义时赋值,比如如下: struct tls_cmd_key_t { u8 format; u8 index; u8 key_l ...
- 8.裸板--C语言下的寄存器的读写置位清零操作
从CPU的角度来看,外设的寄存器跟通用寄存器操作一样,对它们的地址进行读写移位等操作即可进行配置读取写入等动作. 通用寄存器有15个 寄存器名字 Reg# APCS 意义 R0 a1 工作寄存器 R1 ...
- 同步电路出现异步清零可以吗_异步清零和同步清零置数区别
[相关知识]:中规模集成计数器的功能表阅读.反馈清零法和反馈置数法的应用等.本文引用地址:http://www.eepw.com.cn/article/201610/311031.htm [解题方法] ...
- ZeroMemory、memset 和 “={0}”的联系与区别
ZeroMemory.memset 和 "={0}" 三者用于清零操作的区别: 首先是ZeroMemory和memset的区别: 1.ZeroMemory是微软的SDK提供的,me ...
- C++基础之:memset 、ZeroMemory和 “={0}” 三者区别及危险需慎用
memset是以字节为单位,初始化内存块. 当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值, 比如 char data[10]; memset(data, 1, ...
最新文章
- C#利用Graphics类绘制进阶--实现图片等比例缩放
- 【每日一题】502. IPO
- mysql bin log日志
- 无人机自动悬停的实现方法
- red flag linux指定域名,Red Flag Server 4.1 系统管理手册(适用桌面linux4.1) 6
- Java 8 流API(Stream)介绍与示例
- 大数据实战之环境搭建(十)
- 使用Blend开发Silverlight VSM
- springboot 配置文件-yaml的用法
- C# 编译或者解释?
- Notepad++使用心得和特色功能介绍
- 苹果手机解压缩软件_「 神器 」用得贼舒服的压缩/解压缩工具
- 图像入门:MATLAB图像识别
- 用vlookup函数就能判断你的Excel水平处于几段
- 删除wmspdmv监控进程-- 背后的眼睛
- 打卡赠书 | 养成一个思考习惯
- 遍历HashMap的几种常用方法
- linux内核编译最详细,Linux内核编译详细教程,linux内核编译
- AD19学习笔记之原理图的绘制
- vsm java_vsm向量空间模型java实现(源码)
热门文章
- 《细胞》重磅!科学家成功培育全球首个人类自组织心脏类器官,可自主跳动且能自我修复...
- 对CAN/CAN-FD/ETH/Camera同步采集的数据采集工具软件
- CH334U与FE1.1S功能对比
- 用户存续期价值评估(CLV) 一
- HAL库串口中断RX中的Overrun Error问题
- 使用parted 对大容量盘进行分区
- 数据结构:图:AOV网和AOE网
- 中国传统文化常识集锦[转]
- 《企业私有云建设指南》新书出版
- 搭建OpenStack多节点的企业私有云平台——基础基础环境搭建