我已经看过使用ZeroMemory的示例(主要是使用windows和directx结构),但有时却没有使用它。我什么时候应该ZeroMemory结构?
答案 0 :(得分:5)
ZeroMemory
只是用0来填充结构的内存,这实质上意味着结构的每个值都设置为0.如果你没有设置所有的值,这是必要的。结构在将其传递给API函数之前的自定义值。在创建结构时,每个字段中都有未指定的值 - 这会导致函数中的未定义行为,然后访问结构的字段。
答案 1 :(得分:3)
除非您编程的某些外部API要求您这样做(这可能适用于旧的Windows C API),否则您几乎不会在C ++中执行此操作。有一些方法可以使用默认构造函数初始化数据,这样,如果更改了内存容器的数据类型,则构造将自动调整。使用ZeroMemory
初始化数据很脆弱。
有趣的是,微软提到ZeroMemory
甚至可能无法在this documentation for SecureZeroMemory
中使用:
当您想要确保及时覆盖您的数据时,请使用此函数而不是
ZeroMemory
,因为某些C ++编译器可以通过完全删除它来优化对ZeroMemory
的调用。
答案 2 :(得分:3)
如果您要创建 C ++ 程序,请不要使用ZeroMemory。使用构造函数并将列表初始化为init字段。顺便说一句,在C ++ 11中,您可以使用以下语法:
struct A {
int x = 0;
int y = -1;
int z = 42;
};
代替"旧式"
struct A {
int x;
int y;
int z;
A() : x( 0 ), y( -1 ), z( 42 ) {}
};
答案 3 :(得分:2)
ZeroMemory(&a, sizeof(a))
等于memset(&a, 0, sizeof(a));
。它只是用零填充内存。
但是你必须注意a
应该是POD数据。也就是说,一定不能这样做:
std::string str;
ZeroMemory(&a, sizeof(a)); // never!!
您应该将ZeroMemory
和memset
用于POD数据。 (如果您不了解POD数据,它就像C风格的结构一样。)如果您对非POD进行memset
,未定义的行为将会到来..
答案 4 :(得分:1)
当你创建一个结构时(特别是使用旧的Win32 API遗留代码时),你分配的结构可能会有垃圾,因为那些Win32结构没有真正的构造函数。因此,这是一种将结构初始化为默认值的方法。
答案 5 :(得分:1)
如果需要填写大量值,则将结构归零,并且零是您对手动设置不感兴趣的部分的有效值。很抱歉,如果它有点模糊,但基本上是这样的(例如,你有一个充满指针的结构,允许NULL
作为可选值,你只想设置一个其中几个)。
请记住,如果你没有将struct成员设置为任何东西,在大多数情况下,当你创建它们时,它们会充满垃圾(在C ++中,struct可能有一个构造函数已经为你处理了这个)虽然)。
ZeroMemory
是一个Windows的东西,标准的等价物是memset(ptr,0,size)
。它不是你在C ++中经常需要的东西,虽然它在C中弹出很多(尽管你也可以在C中编写类似函数的构造函数,我建议你这样做。)
答案 6 :(得分:1)
它依赖于编译器,新gcc自动为零结构,但较旧的gcc具有随机值(根据maxdev)。