gpt4 book ai didi

c++ - 初始化数组,放置新的,读取变量,定义行为?

转载 作者:太空狗 更新时间:2023-10-29 20:39:32 25 4
gpt4 key购买 nike

给定一个只有 char[10] 成员的类,它既没有继承也没有虚拟成员,它有一个不以任何方式提及数组的构造函数(这样它就成为默认值-initialization -> 没有初始化,像这样:

class in_place_string {
char data[10];

static struct pre_initialized_type {} pre_initialized;
in_place_string(pre_initialized_type) {} //This is the constructor in question

in_place_string() :data() {} //this is so you don't yell at me, not relevent
};

是否定义了将这个类placement-new到一个已经有数据的缓冲区,然后从数组成员中读取的行为?

int main() {
char buffer[sizeof(in_place_string)] = "HI!";
in_place_string* str = new(buffer) in_place_string(in_place_string::pre_initialized);
cout << str->data; //undefined behavior?
}

我很确定它没有明确定义,所以我想问这是实现定义的还是未定义的行为。

最佳答案

您没有执行 reinterpret_cast(这不安全,因为该类具有非平凡的初始化);您正在创建一个其成员未初始化的新对象。

对未初始化的对象执行左值->右值转换会产生不确定的值和未定义的行为。那么对象是否未初始化?

根据 5.3.4 所有new-expression 创建的对象都具有动态存储持续时间。放置新品也不异常(exception)。

Entities created by a new-expression have dynamic storage duration

然后 8.5 说

If no initializer is specified for an object, the object is default-initialized. When storage for an object with automatic or dynamic storage duration is obtained, the object has an indeterminate value, and if no initialization is performed for the object, that object retains an indeterminate value until that value is replaced (5.17). [ Note: Objects with static or thread storage duration are zero-initialized, see end note ] If an indeterminate value is produced by an evaluation, the behavior is undefined except in the following cases:

并且以下情况仅允许 unsigned char,即使这样该值也没有用。

在您的情况下,新对象具有动态存储持续时间 (!),其未执行初始化的成员具有不确定的值。阅读它们会产生未定义的行为。

关于c++ - 初始化数组,放置新的,读取变量,定义行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27595793/

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