生活在别处
这是最近看的一片短文的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。参看如下代码:
posted on 2005-06-29 21:23 Michael 阅读(5661) 评论(7) 编辑 收藏
在C++风格下,还是给予一个恰当的缺省构造函数为妙。
rt
memset有个潜在的危险。 它的后两个参数类型相同,但是含义大相径庭,如果不慎写反了就麻烦了。 这是一本linux/unix书上说的:P
#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length)) #define ZeroMemory RtlZeroMemory 还有,Michael论述了,会清零虚函数表指针。
memset有个潜在的危险。 它的后两个参数类型相同,但是含义大相径庭,如果不慎写反了就麻烦了。 这是一本linux/unix书上说的:P //========== 这是那个UNIX网络编程书上说的,作者搞错过的。
好记性啊,偶就看过 《UNIX网络编程》 和 《LINUX网络编程》 都没记住是哪本说的:P
memset有个潜在的危险。 它的后两个参数类型相同,但是含义大相径庭,如果不慎写反了就麻烦了。 这是一本linux/unix书上说的:P //========== 这是那个UNIX网络编程书上说的,作者搞错过的。 ------------------------------ 这是W.Richard Stevens说的。不过他最早说是在《UNIX环境高级编程》上说得,《UNIX网络编程》是他写的第三部巨著。:p
Powered by: Copyright © Michael