在堆栈与堆中没有构造函数的结构/类的初始化

tuc*_*uxi 2 c++ struct initialization

我想知道在C++中没有默认构造函数的清零结构(或类)的规则.

特别是,似乎如果存储在堆栈中(比如作为局部变量),它们是未初始化的,但如果在堆上分配,它们将被初始化为零(使用GCC 4.9.1进行测试).这可以保证便携吗?

示例程序:

#include <iostream>
#include <map>
using namespace std;

struct X {
    int i, j, k;
    void show() { cout << i << " " << j << " " << k << endl; }
};

int fib(int i) {
    return (i > 1) ? fib(i-1) + fib(i-2) : 1;
}

int main() {
    map<int, X> m;            
    fib(10);                  // fills the stack with cruft
    X x1;                     // local
    X &x2 = m[1];             // heap-allocated within map
    X *x3 = new X();          // explicitly heap-allocated
    x1.show();  // --> outputs whatever was on the heap in those positions
    x2.show();  // --> outputs 0 0 0 
    x3->show(); // --> outputs 0 0 0     
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:在粗体部分删除了"或者我应该只使用构造函数"; 因为让我问的是,我想知道它是否是有保证的行为 - 我们都同意可读代码对于显式构造函数更好.

Lig*_*ica 5

动态分配不是对您的struct成员进行零初始化; 这是你的语法:

X* ptr = new X();
//            ^^
// 
// as opposed to just:
X* ptr = new X;
Run Code Online (Sandbox Code Playgroud)

如果你想保证,那就继续写下来吧.:)

与自动存储持续时间等效的网格很好的替代方法是使用更新的{}语法:

X* ptr = new X{};   // dynamic
X  obj{};           // automatic
Run Code Online (Sandbox Code Playgroud)

具有静态存储持续时间的对象无论如何都始终为零初始化,因此默认情况下您将被覆盖.