gpt4 book ai didi

c++ - 对象存在于 C++ 中意味着什么?

转载 作者:IT老高 更新时间:2023-10-28 12:44:01 25 4
gpt4 key购买 nike

[class.dtor]/15 读取,强调我的:

Once a destructor is invoked for an object, the object no longer exists; the behavior is undefined if the destructor is invoked for an object whose lifetime has ended (3.8).

但是,据我所知,这是标准中对“现有”对象的唯一引用。这似乎也与更具体的 [basic.life] 形成对比:

The lifetime of an object of type T ends when:

  • if T is a class type with a non-trivial destructor (12.4), the destructor call starts, or

  • the storage which the object occupies is reused or released.

我们在这里有两种不同的措辞:“对象的生命周期结束”和“对象不再存在”,前者只发生在非平凡的析构函数中,而后者发生在 any析构函数。差异有什么意义?不再存在的对象意味着什么?

最佳答案

引用的措辞似乎暗示编译器可以在其析构函数的开头处正确插入代码,该代码将与对象关联的内存返回到堆中。但是这样做会消除对象在销毁期间引用其自身成员的能力,如果对象要能够自行销毁,则需要这样做。

所以我认为引用的措辞有问题,应该修复。

关于“一生”和“存在”的含义,我建议有一些不同的上下文,它们在其中意味着不同的东西:

在构造的上下文中,生命周期和存在从构造函数开始时开始。在该上下文之外,它们在构造函数结束时开始。

在析构函数的上下文中,生命周期和存在在析构函数结束时结束。在这种情况下,它们会在破坏开始时结束。

所以一个对象在构造过程中可能会引用它自己的成员,并可能将自己传递给其他对象的函数,这些函数可能会引用该对象及其成员,等等。但一般来说,对象(类的实例)可能不会被引用(不会产生未定义的行为),直到它们的构造函数之一完成。

对象的析构函数可以引用它自己的成员并调用其他(现有)对象的函数,这些对象可能引用被销毁的对象和/或其成员。但一般来说,一个对象在其析构函数启动后可能不会被引用。

这种多上下文定义对我来说是最有意义的,但我可以看到有人提出论点,即从为其分配内存到释放内存的那一刻,一个对象应该被认为是事件的, 我想说浅拷贝的内存应该在一个对象的构造函数启动时分配给它,并在它的析构函数结束时释放。

关于c++ - 对象存在于 C++ 中意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30315524/

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