何时调用类的析构函数?

时间:2017-11-25 07:01:42

标签: c++ class destructor

我有一个列表类,它包含一个pHead指针和一个典型的打印函数。我使用另一个函数(不在列表类中)将上面的列表作为其参数(非ref类型)并调用其print函数。当我调用这个“另一个函数”来打印列表时,它也调用析构函数打印后的列表这应该是那样的吗?有人可以向我解释一下吗? P.s:抱歉英语不好:P

2 个答案:

答案 0 :(得分:2)

当对象超出范围时,析构函数会自动调用

  1. 功能结束
  2. 程序结束
  3. 包含局部变量的块结束
  4. 称为删除操作符
  5. case 中,会调用析构函数,因为当您传递列表类的对象时,它会在函数中创建该对象的副本,并且函数结束这个新创建的对象超出范围,因此调用析构函数。

    修改:扩展到答案; 内存有三种主要类型

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

      1. 如果在自动存储中分配对象,则一旦范围终止,该对象将被销毁;例如
    4. void foo() {
      MyClass myclass_instance;
      myclass_instance.doSomething();
      }
      

      在上述情况下,当函数终止myclass_instance时会自动销毁。

      1. 对象驻留在动态内存(堆)中。它们被赋值为new,并且为了调用dstructor,你需要调用delete:

        int main()
        {
          A* a = new A;
          delete a;    //destructor called
        }
        
      2. 静态分配:对象驻留在静态内存中。无论它们在何处分配,程序结束时都会自动调用析构函数:

        A a; //namespace scope
        
        int main()
        {
        }
        
      3. 这里,当程序终止时,在主要完成后调用析构函数。

答案 1 :(得分:1)

如果对象达到其生命周期的末尾,即对象,则会调用析构函数,即

  1. 当控件到达其范围的末尾时(关闭花括号)(对于具有自动存储持续时间的对象)
  2. 当您为delete(或delete[])分配的对象(对于具有动态存储持续时间的对象)致电new(或new[])时
  3. 当其父级被销毁时(对于类成员对象)
  4. When you manually delete an object created with an overloaded new operator
  5. 当程序退出时(对于具有静态存储持续时间的对象)
  6. 根据你的解释,我猜你通过按值传递它。当函数到达终点时,对象的副本也会达到其生命周期的末尾,因此会自动调用它的析构函数。

    例如(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
    }