当前位置: 首页 > 知识库问答 >
问题:

在具有默认非平凡构造函数的结构上使用值初始化时,结构标量成员是否初始化为零

富凯旋
2023-03-14

如果我有以下结构

struct test
{
    char *x;
    std::string y;
};

我初始化为

test *t = new test();

这应该值初始化对象并根据标准执行以下操作:

如果T是一个(可能是cv限定的)类类型,没有用户提供或删除的默认构造函数,则该对象为零初始化,并检查默认初始化的语义约束,如果T有一个非平凡的默认构造函数,则该对象为默认初始化的;

struct test有一个非常重要的构造函数,可以通过以下方法进行检查:

static_assert(std::is_trivially_constructible<test>::value, "test is not is_trivially_constructible");`)

该标准是否意味着我的test对象在值初始化的情况下应该始终为零初始化,然后随后默认初始化?

如果我立即检查t,我是否能够可靠地假设在执行test*t=new test()之后-

我这样问是因为Coverity给出了一个类型:未初始化指针读取(UNINIT)警告,因为如果您尝试执行类似if(t)的操作,它会报告以下内容-

分配:“t”=“new test”,已分配但未初始化。

Coverity是否将标准误解为“平凡构造函数的值初始化或非平凡构造函数的默认初始化”?如果我删除std::字符串y 成员,因此测试有一个微不足道的默认构造函数,覆盖度不再有警告,并假设char*x成员初始化为零。

值得一提的是,我只是使用g-O3-std=c 17进行编译,并且我无法为我的test对象创建一个不发生零初始化的实际场景。

共有1个答案

何嘉运
2023-03-14

如下所述,该警告不适用于现代C(包括C 17)。

我是否能够可靠地假设在执行<代码>测试*t=新测试()之后

是的,标准保证x是零初始化的,因此检查t-

将T类型的对象或引用初始化为零意味着:

  • 如果T是(可能是cv限定的)非并集类类型,则其填充位初始化为零位,并且每个非静态数据成员、每个非虚拟基类子对象,并且如果该对象不是基类子对象,则每个虚拟基类子对象初始化为零

(强调地雷)

 类似资料:
  • 此代码编译: 该代码不: 报告的错误(在 MSVC、gcc 和 clang 中)表明他们认为 构造函数未定义或不是 ,例如。从叮叮当当: 为什么? (可能与这个问题有关,但在使用时应该是完整的;只有仍然不完整。

  • 主要内容:使用“键值对”初始化结构体,使用多个值的列表初始化结构体,初始化匿名结构体结构体在实例化时可以直接对成员变量进行初始化,初始化有两种形式分别是以字段“键值对”形式和多个值的列表形式,键值对形式的初始化适合选择性填充字段较多的结构体,多个值的列表形式适合填充字段较少的结构体。 使用“键值对”初始化结构体 结构体可以使用“键值对”(Key value pair)初始化字段,每个“键”(Key)对应结构体中的一个字段,键的“值”(Value)对应字段需要初始化的值。 键值对的

  • 问题内容: 我有两个班,第一个是我的主班,第二个是我的编辑框架班。 我的第二个类(UpdateGUI)在其构造函数中提供oldName,并对其进行编辑,当我单击时,它将newName发送给我的第一个类。 我的第二堂课: 我的问题是,为什么newName为null? 更新: UpdateGUIDialog类: 输出: 我需要打印而不是null。 问题答案: Java对象有点像真实对象。并顾名思义:它

  • 我有一个类定义为 由于类中有一个const成员,编译器会隐式删除默认的复制构造函数。需要给它一个参数进行初始化。 问题出现在课堂上 这个类包含前面类对象的std::array。如何初始化这个数组?大小参数需要给std::array的每个元素来初始化。我想将std::array的每个元素设置为。 当然,我可以使用初始值设定项列表,但由于构造函数有12个元素和其他参数,代码变得越来越难看。此外,我用6

  • 问题内容: 我是Golang的新手,所以分配它会让我发疯: 之后,我打电话给: 这时我得到了nil指针恐慌。 我通过使用另一个函数并在之后调用它来解决该问题: 但是我想知道,是否有可能摆脱这种样板初始化? 问题答案: 您只需要一个构造函数。常用的模式是 如果结构中有更多字段,启动goroutine作为后端或注册终结器,则可以在此构造函数中完成所有操作。

  • 问题内容: 我有一个对象 我用两种方式初始化它 这是输出 似乎builder没有获得默认值。我在属性中添加了注释,对象现在看起来像这样 这是控制台输出 我怎样才能使他们俩都成为? 问题答案: 我的猜测是,这是不可能的(没有删除代码)。但是,为什么不仅仅实现所需的构造函数呢?Lombok旨在使您的生活更轻松,如果Lombok无法解决某些问题,请按照老式的方式进行操作。 控制台输出: