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

时间:2015-05-19 01:55:28

标签: c++ c++11 language-lawyer c++14 object-lifetime

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

  

为对象调用析构函数后,该对象不再存在;如果为生命周期结束的对象调用析构函数(3.8),则行为未定义。

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

  

类型T的对象的生命周期在以下时间结束:

     
      
  • 如果T是具有非平凡析构函数(12.4)的类类型,则析构函数调用将启动,或者

  •   
  • 重复使用或释放​​对象占用的存储空间。

  •   

我们在这里有两个不同的措辞:“对象的生命周期结束”和“对象不再存在”,前者只发生在非平凡的析构函数中,后者发生在任何析构函数。差异的意义是什么?一个物体不再存在的含义是什么?

1 个答案:

答案 0 :(得分:1)

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

所以我认为所引用的措辞已经破裂,应该修复。

关于什么"生命周期"和#34;存在"意思是,我建议有一些不同的背景,其中它们意味着不同的东西:

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

在破坏,生命和存在的背景下,当析构函数结束时。在这种背景之外,它们在破坏开始时结束。

因此,对象可以在构造期间引用其自己的成员,并且可能将其自身传递给其他对象的函数,其可以引用对象及其成员,等等。但一般情况下,对象(类的实例)可能不会被引用(不产生未定义的行为),直到它们的一个构造函数完成之后。

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

这种多上下文定义对我来说是最有意义的,但是我可以看到一个对象应该被认为是从内存分配到内存释放的那一刻起它是活着的。 ,我会说当一个对象的构造函数启动时,应该为一个对象分配一个浅拷贝的内存,并在它的析构函数结束时释放它。