C++空括号成员初始化 - 会将内存清零吗?

4

我最初写的代码是这样的:

class Foo
{
public:
  Foo() : m_buffer()
    {}

private:
  char   m_buffer[1024];
};

有人比我聪明,说使用m_buffer()初始化器会清零内存。我的意图是保留未初始化的内存。我没有时间进一步讨论,但这引起了我的好奇心。

以前,我认为总是在初始化列表中列出每个成员是明智的。

请问有人能进一步描述这种行为吗?

1)为空括号初始化器为什么会填充内存?

2)它只适用于POD数据类型吗?我听说是这样的,但没有标准可查。

谢谢


这样做。哪种方式?请澄清。 - Mykola Golubyev
完成 - 我指的是填充内存的操作。 - jw.
2个回答

12
如果您有一个成员被初始化为这样,它将会是“值初始化”。对于POD也是如此。对于结构体,每个成员都是按照这种方式进行值初始化的,对于数组,其中的每个元素都是值初始化的。
对于指针或整数等标量类型的值初始化,您将其初始化为转换为正确类型的“0”。因此,您将获得具体类型的空指针、false或其他内容。
请注意,规则从C++98到C++03(我们现在所拥有的版本)略有变化,可能会产生令人惊讶的影响。C++98没有“值初始化”。它说默认初始化会发生,对于非POD类型总是意味着它的默认构造函数被调用。但是,在没有用户声明的构造函数时,C++03中的“值初始化”具有特殊含义:每个元素都会被值初始化。
以下是差异:
struct A { int c; ~A() { } }; // non-POD, but no user declared ctor
struct B { A a; B():a(){ } } b;

在 C++03 中,保证 b.a.c 的值为零。但在 C++98 中,b.a.c 的值将是一些不确定的值。


2
值初始化引导我进入了这个Boost网站:http://www.boost.org/doc/libs/1_38_0/libs/utility/value_init.htm#valueinit 显然,一些编译器在值初始化时会出错,导致某些变量未被初始化。但了解标准仍然是很有用的。 - jw.
我认为你把89和98搞混了? - jw.

1
以前,我认为在初始化列表中列出每个成员是明智的选择,以确保所有成员都被初始化。
要解决您的任务,只需从初始化列表中删除 m_buffer。
template <typename T>
struct C
{
    C():
        buff(),
        var(),
        object()
    {
    }
    T buff[128];
    T var;
    std::string object;
};

无论 T 类型是使用 T() 的默认构造函数。对于整数、字符等,它是 0;对于数组,它是 {T()}。对于类,它只是它们的默认构造函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接