【问题标题】:When does a destructor of a class is called ? [closed]什么时候调用类的析构函数? [关闭]
【发布时间】:2018-05-09 01:40:23
【问题描述】:

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

【问题讨论】:

  • 除非您提供 minimal reproducible example 进行演示,否则我们无法判断您的问题。
  • 因为当您将值传递给作为非 -ref 函数时 .. 函数在本地为它自己创建列表,当您的函数任务完成并且函数列表变量范围结束时,它正在调用该变量的析构函数

标签: c++ class destructor


【解决方案1】:

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

  1. 函数结束
  2. 程序结束
  3. 包含局部变量的块结束
  4. 调用删除操作符

在您的案例中,调用析构函数是因为当您传递列表类的对象时,它会在函数中创建该对象的副本,并且当函数结束这个新创建的对象超出范围,因此调用了析构函数。


编辑:扩展到答案; 内存主要分为三种

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

    1. 如果您在自动存储中分配对象,则一旦范围终止,该对象将被销毁;例如
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()
    {
    }
    

这里,当程序终止时调用 As 析构函数,在 main 完成之后。

【讨论】:

  • c++ 标准没有“堆”的概念
  • 也许在较新版本的编译器中,因为我记得研究过它确实如此。因为它也说过,将大内存对象放入堆中并进行动态分配。
  • 只需在this document 中搜索heap这个词。这些事件都与内存分配无关。
  • 基本上free store就是用的术语,free store的数据结构是堆。感谢您提供新信息:)
【解决方案2】:

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

  1. 当控件到达其范围的末尾时(右花括号)(对于具有自动存储持续时间的对象)
  2. 当您为使用new(或new[])分配的对象调用delete(或delete[])时(对于具有动态存储持续时间的对象)
  3. 当其父对象被销毁时(对于类成员对象)
  4. When you manually delete an object created with an overloaded new operator
  5. 程序退出时(对于具有静态存储持续时间的对象)

根据你的解释,我猜你是按值传递。当函数到达终点时,对象的副本也到达其生命周期的终点,因此会自动调用其析构函数。

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

【讨论】:

    猜你喜欢
    • 2019-04-07
    • 2015-09-23
    • 1970-01-01
    • 2013-06-20
    • 2021-02-16
    • 1970-01-01
    • 2020-11-05
    • 2011-03-15
    • 1970-01-01
    相关资源
    最近更新 更多