C++ 什么时候在C++;?

C++ 什么时候在C++;?,c++,memory,struct,zero,C++,Memory,Struct,Zero,我见过使用ZeroMemory的示例(主要用于windows和directx结构),但其他时候不使用。什么时候我应该使用ZeroMemory结构?ZeroMemory(&a,sizeof(a))等于memset(&a,0,sizeof(a))。它只是用零填充内存 但您必须注意,a应该是POD数据。也就是说,您不能执行以下操作: std::string str; ZeroMemory(&a, sizeof(a)); // never!! 您应该使用ZeroMemory和memset来存储

我见过使用ZeroMemory的示例(主要用于windows和directx结构),但其他时候不使用。什么时候我应该使用ZeroMemory结构?

ZeroMemory(&a,sizeof(a))
等于
memset(&a,0,sizeof(a))。它只是用零填充内存

但您必须注意,
a
应该是POD数据。也就是说,您不能执行以下操作:

std::string str;
ZeroMemory(&a, sizeof(a)); // never!!

您应该使用
ZeroMemory
memset
来存储数据。(如果你不知道POD数据,它就像C风格结构)。如果你把代码> MyStuts<代码>到非POD,不确定的行为就会来。

< P>你应该在C++中永远不做这件事,除非你正在编程的一些外部API要求你这么做(这很可能是针对旧Windows C API)。有几种方法可以使用默认构造函数初始化数据,这样,如果内存库中的数据类型发生更改,构造将自动调整。使用
ZeroMemory
初始化数据是脆弱的

有趣的是,Microsoft提到了
ZeroMemory
甚至可能无法在以下环境中工作:

当您想确保您的数据将被立即改写时,使用此函数而不是<代码>零内存>代码>,因为某些C++编译器可以通过完全删除它来优化对<代码>零内存>代码>的调用。
当您创建一个结构时(特别是在使用旧的Win32 API遗留代码时),您分配的结构中可能有垃圾,因为这些Win32结构没有真正的构造函数。因此,这是一种将结构初始化为默认值的方法。

ZeroMemory
只是用0填充结构的内存,本质上意味着结构的每个值都设置为0。如果在将结构传递给例如API函数之前未将其所有值设置为自定义值,则这是必需的。创建结构时,每个字段中都有未指定的值-这会导致访问结构字段的函数中出现未定义的行为。

如果要创建C++程序,则不要使用ZeroMemory。使用构造函数和初始化列表初始化字段。顺便说一句,在C++11中,您可以使用以下语法:

struct A {
    int x = 0;
    int y = -1;
    int z = 42;
};
而不是“旧式”


当有很多值需要填写时,可以将结构置零,并且对于不想手动设置的部分,零是有效值。抱歉,如果这有点模糊,但基本上就是这样的(例如,对于可选值,您有一个满是指针的结构,允许其
NULL
,并且您只想设置其中的几个)

请记住,如果你不将结构成员设置成任何东西,在大多数情况下,当你创建它们时,它们会被垃圾填充(C++中,结构可能有一个已经为你处理这个问题的构造函数)。
ZeroMemory
是windows的一个东西,标准的等价物是
memset(ptr,0,size)
。它不是C++中经常需要的东西,虽然它在C中弹出相当多(虽然你也可以在C中编写构造函数类似的函数,我建议你这样做)。

< p>它是编译器的依赖项,新的GCC自动零结构,而旧的GCC具有随机值(根据Max DEV)。p> 看看这条线:

真正的问题是,一个人可以
memset
非pod,但它会产生未定义的行为。它可以工作,也可以不工作,但无论如何,它都会导致代码不可移植和高度脆弱。你的帖子中的问题是,你写了
,也就是说,你不能这样:
//错误,但您既不能不这样做,也不会产生错误。你完全可以<代码> MyStuts<代码> C++中的一切,但是在法律基础上,这给了未定义的行为。我打算说“你不能这样做;如果你这样做,错误就会发生”,但我同意有一些误导。我会编辑。现在看起来好多了:)它们不能被“曲解”。即使读取未初始化的值也是未定义的行为,这会导致程序格式错误。它们可以,因为接收值的函数假定这些值是正确的。它无法检查这些值是否由用户设置,或者它们是否是该内存区域的初始值(可能是任何值)。您似乎不理解C中未初始化的值。访问它们是未定义的行为。你不会得到误解,只是简单的未定义的行为。不,我指的是任何值,包括指针。阅读OK,你是对的:)(根据该信息编辑问题)
struct A {
    int x;
    int y;
    int z;
    A() : x( 0 ), y( -1 ), z( 42 ) {}
};