调用者应该初始化“out”参数吗?

时间:2010-01-06 10:59:31

标签: c++ windows language-agnostic visual-c++ initialization

许多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()电话有什么意义吗?没有它会发生什么?

3 个答案:

答案 0 :(得分:4)

嗯,总的来说,我认为不需要初始化,但如果你不确切知道被调用函数对输出变量中的值做了什么,那么这是很好的做法。 在这种特定情况下,ICONINFO结构有两个HBITMAP成员,它们实际上是指向位图的指针。在一般情况下,我会说,如果你将指针传递给函数,那么你必须确定:

  1. 你传递指向什么都没有的指针 你调用的函数创建了这个东西 指向你,并确保 你的指针指向它。 (可能会让你管理新分配的东西)或
  2. 你传入一个指向的指针 某事(即你为它分配的东西)和 函数使用你分配的内容。
  3. GetIconInfo()函数适合第一种情况。因此,为了清晰,甚至安全,我认为确保HBITMAP结构的ICONINFO成员实际上为零,而不是随机值可以进一步导致各种肮脏,这对我来说是一个好主意。在路上。

    所以我在这个案例中的判决也是:不是必要的,但是很好的做法

答案 1 :(得分:1)

无。我的意思是,如果一个人非常确定在调用之前写入的内容被丢弃,那么就没有理由这样做。但我们不知道API内部如何 除非我们开发了API,否则初始化它是个好主意。

答案 2 :(得分:1)

  

这意味着该函数不会读取存储在“out”中的原始值    参数 - 仅更改它们 - 因此调用者可以自由跳过初始化。

也许它不是关于读取字段的功能。也许它用于检测功能未填充的字段?我不知道在这种情况下是否有必要,只是指出它可能不是关于阅读。