什么时候称为班级的攻击者

When does a destructor of a class is called ?

本文关键字:攻击者 什么时候      更新时间:2023-10-16

i有一个列表类,该类具有phead指针和典型的打印功能。我使用另一个函数(不是在列表类中),将上述列表称为其参数(非REF类型)并调用其打印功能。当我称其为"另一个函数"以打印列表时,它也会调用Destructor打印后的列表。应该这样吗?有人可以向我解释吗?
P.S:对不起,英语不好:P

当对象脱离范围时,destructor函数被称为

  1. 功能结束
  2. 程序结束
  3. 一个包含本地变量结束的块
  4. 删除操作员称为

在您的案例中,destructor之所函数结束此新创建的对象从范围出现,因此被称为destructor。


编辑:扩展到答案;内存的三种主要类型

  1. 自动存储(堆栈)
  2. 动态存储(堆)
  3. 静态存储

    1. 如果您在>自动中分配一个对象,则一旦示波器终止,该对象将被破坏;例如
void foo() {
MyClass myclass_instance;
myclass_instance.doSomething();
}

在上述情况下,函数终止myClass_instance会自动破坏。

  1. 对象位于 dynamic 内存(堆)中。它们是新的,为了使dstructor被调用,您需要调用delete:

    int main()
    {
      A* a = new A;
      delete a;    //destructor called
    }
    
  2. 静态分配:对象位于静态内存中。无论分配哪里分配,程序结束时都会自动调用破坏者:

    A a; //namespace scope
    int main()
    {
    }
    

在这里,当程序终止时,destructor被称为destructor。

如果对象达到其寿命的末端,即。

  1. 当控件到达其范围的末端(关闭卷曲括号)(对于具有自动存储持续时间的对象)
  2. 当您致电delete(或delete[])以分配给new(或new[])的对象时(对于具有动态存储持续时间的对象)
  3. 当父母被销毁时(对于班级成员对象)
  4. 当您手动删除用超载new操作员创建的对象时
  5. 当程序退出时(对于具有静态存储持续时间的对象)

根据您的解释,我想您是通过value 将其传递给它的。当功能达到其末尾时,对象的副本也达到其寿命范围的末端,因此其破坏者被称为自动称为。

例如(Case x表示对象tx在此处销毁):

struct T{
    int a;
    ~T() { /* anything */ }
} t5;
struct U{
    T t3;
};
void foo() {
    T t1;
}  // Case 1
int main() {
    foo();
    // Case 1
    T *pt2 = new T();
    delete pt2;  // Case 2
    {
        U u1;
    }  // Case 3
    void *buf = malloc(1000);
    T *pt4 = new(buf) T();
    pt4 -> ~T(); // Case 4
    return 0; // Case 5
}