【问题标题】:C++ empty-paren member initialization - zeroes out memory?C++ 空括号成员初始化 - 将内存清零?
【发布时间】:2009-04-10 01:21:39
【问题描述】:

我最初写了一些这样的代码:

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

private:
  char   m_buffer[1024];
};

比我聪明的人说,使用 m_buffer() 初始化程序会将内存清零。我的意图是让内存保持未初始化状态。我没有时间进一步讨论它,但它激起了我的好奇心。

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

有人可以进一步描述这种行为吗?

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

2) 它仅适用于 POD 数据类型吗?听说是这样,但是手头没有标准。

谢谢

【问题讨论】:

  • “以这种方式行事”。哪一条路?请澄清。
  • 完成——我指的是内存的填充

标签: c++ initialization standards


【解决方案1】:

如果你有一个这样初始化的成员,它将是value-initialized。 POD 也是如此。对于结构,每个成员都以这种方式进行值初始化,而对于数组,它的每个元素都进行值初始化。

对于指针或整数等标量类型的值初始化,您会将其初始化为0,并转换为正确的类型。因此,您将获得空指针或 false 或您具体拥有的任何类型。

请注意,规则从 C++98 到 C++03(我们现在拥有的)微妙地改变了,这可能会产生令人惊讶的效果。 C++98 没有那个value-initialization。它说默认初始化发生,对于非 POD 类型总是意味着它是默认构造函数调用。但是如果没有用户声明的构造函数,C++03 中的value-initialization 具有特殊含义:然后每个元素都进行值初始化。

这里有区别:

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】:

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

这是为了确保所有成员都已初始化。

要解决您的任务,只需从初始化列表中删除 m_buffer。

template <typename T>
struct C
{
    C():
        buff(),
        var(),
        object()
    {
    }
    T buff[128];
    T var;
    std::string object;
};

使用 T() 的任何 T 类型都适用于默认构造函数。对于 int、chars 等它是 0,对于数组它是 {T()}。对于类来说,它只是它们的默认构造函数。

【讨论】:

    猜你喜欢
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多