gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:50:28 34 4
gpt4 key购买 nike

我想知道在 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;
}

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

最佳答案

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

X* ptr = new X();
// ^^
//
// as opposed to just:
X* ptr = new X;

如果你想保证它,就继续写吧。 :)

与 automatic-storage-duration 等效的替代方法是使用更新的 {} 语法:

X* ptr = new X{};   // dynamic
X obj{}; // automatic

无论如何,具有静态存储持续时间的对象总是预零初始化,所以默认情况下你会被覆盖。

关于c++ - 在堆栈与堆中没有构造函数的结构/类的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30077670/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com