许多Win32 API函数都将参数指定为“out”。例如,GetIconInfo()描述说明函数填充结构成员的第二个参数。
这意味着该函数不会读取存储在“out”参数中的原始值 - 只会更改它们 - 因此调用者可以自由跳过初始化。
然而在一个项目中,我看到以下内容:
ICONINFO ii;
::SecureZeroMemory(&ii, sizeof(ICONINFO));
if (::GetIconInfo(hIcon, &ii))
{
//do stuff, then
//release bitmaps
if(ii.hbmMask)
::DeleteObject(ii.hbmMask);
if(ii.hbmColor)
::DeleteObject(ii.hbmColor);
}
SecureZeroMemory()
电话有什么意义吗?没有它会发生什么?
答案 0 :(得分:4)
嗯,总的来说,我认为不需要初始化,但如果你不确切知道被调用函数对输出变量中的值做了什么,那么这是很好的做法。
在这种特定情况下,ICONINFO
结构有两个HBITMAP
成员,它们实际上是指向位图的指针。在一般情况下,我会说,如果你将指针传递给函数,那么你必须确定:
GetIconInfo()
函数适合第一种情况。因此,为了清晰,甚至安全,我认为确保HBITMAP
结构的ICONINFO
成员实际上为零,而不是随机值可以进一步导致各种肮脏,这对我来说是一个好主意。在路上。
所以我在这个案例中的判决也是:不是必要的,但是很好的做法。
答案 1 :(得分:1)
无。我的意思是,如果一个人非常确定在调用之前写入的内容被丢弃,那么就没有理由这样做。但我们不知道API内部如何 除非我们开发了API,否则初始化它是个好主意。
答案 2 :(得分:1)
这意味着该函数不会读取存储在“out”中的原始值 参数 - 仅更改它们 - 因此调用者可以自由跳过初始化。
也许它不是关于读取字段的功能。也许它用于检测功能未填充的字段?我不知道在这种情况下是否有必要,只是指出它可能不是关于阅读。