gpt4 book ai didi

c++ - 在堆上创建的对象不是全局的?

转载 作者:行者123 更新时间:2023-11-28 03:05:34 25 4
gpt4 key购买 nike

我看了S. Lippman的书《inside c++ object model》,有没有这样的代码

class Foo { public: int val; Foo *pnext; };
void foo_bar()
{
// Oops: program needs bar's members zeroed out
Foo bar;
Foo* baz = new Foo(); // this line i added myself
if ( bar.val || bar.pnext )
// ... do something
// ...
}

它说"没有为此代码片段合成默认构造函数。

全局对象保证在程序启动时将其关联的内存“清零”。本地对象在程序堆栈上分配的和在自由存储上分配的堆对象没有它们的关联内存清零;相反,内存保留了之前使用的任意位模式。”

在这段代码中,baz 对象是在堆上创建的,根据上面所说,这个对象不是全局的,不会调用默认构造函数。我理解正确吗?

最佳答案

new Foo() 中的括号指定值初始化;这基本上意味着每个成员都是零初始化的。相反,如果您说 new Foo,那么成员将保持未初始化状态,因为它们是您的自动变量。

不幸的是,要对自动变量进行值初始化,您不能编写 Foo bar(),因为它声明了一个函数。你需要

Foo bar{};        // C++11
Foo bar = Foo(); // Historical C++

关于c++ - 在堆上创建的对象不是全局的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19830981/

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