ZeroMemory和memset的区别
摘自百度百科,保存为学习使用
ZeroMemory,是美国微软公司的软件开发包SDK中的一个宏。 其作用是用0来填充一块内存区域。
声明
void ZeroMemory( PVOID Destination,SIZE_T Length );
参数
Destination :指向一块准备用0来填充的内存区域的开始地址。
Length :准备用0来填充的内存区域的大小,按字节来计算。
返回值
无
作用
ZeroMemory只是将指定的内存块清零。
使用结构前清零,而不让结构的成员数值具有不确定性,是一个好的编程习惯。
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 ;}
int a;
};
int main(int argc, char* argv[])
{
char sztmp[];
/// 安全操作
ZeroMemory(sztmp, sizeof(sztmp));
/// 安全操作
SPerson sTest = {};
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 ;
}
因此,在windows平台下,数组或纯结构使用ZeroMemory是安全的,而类(class)就使用构造函数进行初始化,不要调用ZeroMemory。
另外,如果一个类的结构中包含STL模板(Vector、List、Map等等),那么使用ZeroMemory对这个类的对象中进行清零操作也会引起一系列的崩溃问题(指针指向内存错误、迭代器越界访问等)。所以,再次强烈建议:类(class)只使用构造函数进行初始化,不要调用ZeroMemory进行清零操作。
在Windows编程中,ZeroMemory的作用是用0来填充一块内存区域,主要是你填充一些数据结构时把它们填为0比较保险,因为很多默认的参数取值为NULL,操作系统会替你解决。
ZeroMemory和memset的区别的更多相关文章
- C++ 中 ZeroMemory、memset 危险需慎用
使用C/C++编程时,常使用ZeroMemory.memset或 “={0}”来对结构体对象进行初始化或清零.然而这三种方式都有各自的特点,使用时需谨慎,否则容易出现严重错误,本人今日解决一个导致宕机 ...
- 【转】bzero, memset ,setmem 区别
原文网址:http://blog.csdn.net/agathe/article/details/6066157 bzero 原型: extern void bzero(void *s, int n ...
- fill与memset的区别
fill 的头文件是<iostream> 命名空间是std: 在memset(a,0(-1),sizeof(a))全部初值定为0或-1时两者是没有多大区别; 但是在初值为其他值得时候就不同 ...
- strcpy、memcpy和memset的区别
strcpy 原型:extern char *strcpy(char *dest,char *src); 用法:#include <string.h> 功能:把src所指由NULL结束的字 ...
- bzero, memset ,setmem 区别【转】
本文转载自:http://chang6520.blog.163.com/blog/static/112665875201302843359715/ bzero 原型: extern void bzer ...
- fill和memset的区别
https://blog.csdn.net/xs18952904/article/details/75195412 memset只能初始化成为0或者-1,其他都要用fill来完成. #include& ...
- fill,fill-n,memset的区别
这里在网上搜集归纳了一个总结 memset函数 按照字节填充某字符 在头文件<string.h>中 因为memset函数按照字节填充,所以一般memset只能用来填充char型数组,(因为 ...
- C++中的memset、zeroMemory和={0}操作( 转)
使用C/C++编程时,常使用ZeroMemory.memset或 “={0}”来对结构体对象进行初始化或清零.然而这三种方式都有各自的特点,使用时需谨慎,否则容易出现严重错误,本人今日解决一个导致宕机 ...
- sizeof, strlen区别
strlen与sizeof的区别 .sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型. 该类型保证能容纳实现所建立的最大对象的字节大小. .size ...
随机推荐
- HW2.13
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- Spark RDD概念学习系列之RDD的容错机制(十七)
RDD的容错机制 RDD实现了基于Lineage的容错机制.RDD的转换关系,构成了compute chain,可以把这个compute chain认为是RDD之间演化的Lineage.在部分计算结果 ...
- Xcode5 上使用Base SDK iOS6程序和iOS6模拟器
Xcode 5默认自带SDK 7.0,升级Xcode 5后,Xcode.5就没了,这样我想编译SDK 6.x的程序就难办了(除非同时安装Xcode 4.x和Xcode 5.x两个版本Xcode).其中 ...
- tensorflow 实现线性方程
下面的直接是代码: #!usr/bin/env python#coding:utf-8"""这个代码的作用是 通过 tensorflow 来计算 y = 0.3x + 0 ...
- jquery中链式操作的this指向
jquery中链式操作是如何实现? 例如:$(obj).children().css('color','red').next().css('color','red').siblings().css(' ...
- 算法基础:最大递减数问题(Golang实现)
给出一个非负整数,找到这个非负整数中包括的最大递减数.一个数字的递减数是指相邻的数位从大到小排列的数字. 如: 95345323,递减数有:953,95,53,53,532,32, 那么最大的递减数为 ...
- VS中调用SQL SERVER存储过程
存储过程是经过编译的,永久保存在数据中的一组SQL语句,通过创建和使用存储过程能够提高程序的重用性和扩展性,为程序提供模块化的功能,还有利于对程序的维护和管理.以下就详谈一下,VB.NET怎样调 ...
- 关于模拟器不能运行项目问题:Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE
我有一个习惯,当做完某一项功能时就想试试运行效果.所以一个程序完成前会运行无数遍.但是有时会出现不能运行的问题,并且这个问题不是来自项目的错误,显示器显示如下错误: [2013-08-31 08:45 ...
- Web版的各种聊天工具
直到近期为止,我们经常使用的即时聊天工具(QQ.msn等)了Web版,大家不用下载庞大软件,直接打开网页就能够与自己的好友聊天,非常方便.在此将时汇总 便于大家查找 节约大 ...
- ThinkPHP中的动态缓存(S方法)和快速缓存(F方法)(转)
系统默认的缓存方式是采用File方式缓存,我们可以在项目配置文件里面定义其他的缓存方式,例如,修改默认的缓存方式为Xcache(当然,你的环境需要支持Xcache) 对于File方式缓存下的缓存 ...