C++:类析构函数做什么

C++: What does the class destructor do?

本文关键字:什么 析构函数 C++      更新时间:2023-10-16

>C++:类析构函数是做什么的?

假设我们有一个对象"myObject",并且有几个成员,如下所示:

int a;
float b;
yourClass yourObject;
void hisMethod();

从我读到的内容来看,分配给"myObject"的内存是这样的顺序。

调用析构函数后,会发生什么?

调用析构函数之后,在对象被销毁之前,从我读到的内容来看,我仍然可以访问(a( 对象"我的对象"。(b( 会员您的对象(c( 成员他的方法((

我还能访问其成员吗?这是未定义的行为?

许多C++书都没有谈论更多关于它的细节。我在哪里可以找到更多详细信息?因为细节可以帮助我理解许多C++规则,例如"除非放置新后,否则不要手动调用析构函数"。

[更新1] 我提出我的问题,因为我看到了帖子:空析构函数有什么作用?海报给出了如下示例:

#include <iostream>
#include <set>

class a
{
public:
std::set <int> myset;
};
int main()
{
a object;
object.myset.insert(55);
object.~a();
object.myset.insert(20);
std::cout << object.myset.size();
}

海报得到:"* glibc 检测到 */.app:双重释放或损坏(fasttop(:",然后是"ABORT"。

这意味着:

object.myset.insert(20);

不会引发错误,这意味着在手动调用析构函数后对象仍然存在。它的类成员仍然可以被调用!

解构函数的双重调用会产生错误。

[更新 1] 我在 QT Creator 中运行代码,当运行到 object.myset.insert(20( 时;

它引发错误:

读取访问冲突:0x0,标志=0x0。

yourClass yourObject;的情况下,销毁后无法访问你的对象,
因为编译器会在您开始执行之前抱怨。
在本例中(自动存储持续时间(,范围是对象的生存期,因此销毁后,您处于一个代码部分,其中的名称 yourObject 不再为人所知。

(析构函数和实际内存释放分开的,但两者都是连续发生的,没有任何可能在它们之间放置一些自己的代码(。

如果你有一些指针,分配了一些东西 new ,以及delete它:
是的,在delete之后访问它是未定义的行为。

类析构函数,即名为~class的方法,可以执行您要求它执行的任何操作。它不会释放内存。

析构函数

作为销毁对象过程的一部分调用,此过程通常还会在其析构函数运行后释放与对象关联的内存。根据对象的创建位置和方式,将发生不同的内存"释放":

  • 在堆栈上,内存由堆栈帧指针更新隐式释放
  • 在堆上,它将通过将内存释放回堆来释放
  • 对于静态,内存并没有真正释放