许多 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()
调用有什么意义吗?没有它会发生什么?
最佳答案
好吧,一般来说我认为不需要初始化,但是如果您不确切知道被调用函数对输出变量中的值做了什么,这是一个很好的做法。
在这种特定情况下,ICONINFO
结构有两个HBITMAP
本质上是指向位图的指针的成员。在一般情况下,我会说,如果您将指针传递给函数,那么您必须确定:
- 你传递一个指向任何东西的指针和 你调用的函数创建了东西 为您指出并确保 你的指针指向它。 (并且可能让您管理新分配的东西)或
- 你传入一个指向 一些东西(即你为它分配了一些东西)和 函数使用您分配的内容。
GetIconInfo()
函数适合第一种情况。因此,为了清晰甚至安全起见,确保 ICONINFO
结构的 HBITMAP
成员实际上为零,而不是可能导致的随机值,这对我来说似乎是个好主意到道路上的各种肮脏。
所以我对这种情况的判断也是:没有必要,但很好的做法。
关于c++ - 调用者是否应该初始化 "out"参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2012379/