将构造函数中的结构清零

sha*_*oth 3 c++ winapi

Win32编程中使用了各种结构.很多时候只使用它们的一些字段而所有其他字段都设置为零.例如:

STARTUPINFO startupInfo; // has more than 10 member variables
ZeroMemory( &startupInfo, sizeof( startupInfo ) ); //zero out
startupInfo.cb = sizeof( startupInfo ); //setting size is required according to MSDN
startupInfo.dwFlags = STARTF_FORCEOFFFEEDBACK;
//Now call CreateProcess() passing the startupInfo into it
Run Code Online (Sandbox Code Playgroud)

我想停止复制粘贴这样的代码,而是使用一个关心归零和设置参数的抽象.让我们假设我只需要在示例中初始化结构,并且不需要其他调整.以下是一个很好的解决方案吗?有什么可能的问题?

class CStartupInfo : public STARTUPINFO {
public:
   CStartupInfo()
   {
       ZeroMemory( this, sizeof( STARTUPINFO ) );
       cb = sizeof( STARTUPINFO );
       dwFlags = STARTF_FORCEOFFFEEDBACK;
   }
};
Run Code Online (Sandbox Code Playgroud)

我特别关注ZeroMemory()调用 - 看起来我完全控制代码并且类没有vtable并且调用ZeroMemory()这种方式是安全的并且两个代码片段之间没有大的区别,除了后者提供抽象.有什么警告吗?

Dae*_*min 5

对于您可以做的结构:

STARTUPINFO startup_info = { sizeof(STARTUPINFO), 0 };
startup_info.dwFlags = STARTF_FORCEOFFFEEDBACK;
Run Code Online (Sandbox Code Playgroud)

我发现这是一种巧妙的技巧来初始化这些结构.然而,问题是cb(或大小/长度)字段必须是结构中的第一个字段.如果需要,你也可以只做扩展版本:

STARTUPINFO startup_info = { 0 };
startup_info.cb = sizeof(STARTUPINFO);
startup_info.dwFlags = STARTF_FORCEOFFFEEDBACK;
Run Code Online (Sandbox Code Playgroud)

如果你想用一个类包装结构,我建议你首先尝试ATL/WTL,因为你要包装的结构可能已经作为类存在了.

如果您仍然热衷于创建自己的类,我建议您创建一个构造函数,按顺序获取结构的每个元素,并指定默认参数,以便以后更容易更改这些值.