你什么时候在C ++中使用ZeroMemory结构?

时间:2014-04-07 10:52:13

标签: c++ memory struct zero

我已经看过使用ZeroMemory的示例(主要是使用windows和directx结构),但有时却没有使用它。我什么时候应该ZeroMemory结构?

7 个答案:

答案 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!!

您应该将ZeroMemorymemset用于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)。

看一下这个帖子: When zeroing a struct such as sockaddr_in, sockaddr_in6 and addrinfo before use, which is correct: memset, an initializer or either?