c++ - 调用者是否应该初始化 "out"参数?

标签 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() 调用有什么意义吗?没有它会发生什么?

最佳答案

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

  1. 你传递一个指向任何东西的指针和 你调用的函数创建了东西 为您指出并确保 你的指针指向它。 (并且可能让您管理新分配的东西)或
  2. 你传入一个指向 一些东西(即你为它分配了一些东西)和 函数使用您分配的内容。

GetIconInfo()函数适合第一种情况。因此,为了清晰甚至安全起见,确保 ICONINFO 结构的 HBITMAP 成员实际上为零,而不是可能导致的随机值,这对我来说似乎是个好主意到道路上的各种肮脏。

所以我对这种情况的判断也是:没有必要,但很好的做法

关于c++ - 调用者是否应该初始化 "out"参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2012379/

相关文章:

sql - 哪种语言有好的 SQL 解析库?

c++ - 在模板参数列表中避免自动

windows - 指定编译器 NVCC 用于编译主机代码

c++ - 进程 ID 和进程名称

Windows 批处理文件 - 如果窗口标题包含文本,则 taskkill

c# - Environment.CurrentDirectory 设置为 system32;我如何确定在哪里?

math - 可以将具有多个模运算符 (a % b % c) 的表达式简化为其他内容吗?

algorithm - 将帧转换为 NTSC 丢帧时间码

c++删除排序数组中的重复项-打印新数组

c++ - 将 1 个 C++ 循环变成 2 个