在c++中调用类的析构函数时

When exactly destructor of a class invoked in C++?

本文关键字:析构函数 调用 c++      更新时间:2023-10-16

我是c++新手。为了理解c++中的构造函数和析构函数是如何工作的,我编写了下面的代码。

#include<iostream>
using namespace std;
class Line
{
    private:
        Line();
    public:
        int length;
        static void getInstance(Line* objLine);
        ~Line();
};
void Line::getInstance(Line* objLine)
{
    if(objLine == NULL)
    {
        objLine = new Line();
    }
}
Line::Line()
{
    cout<<"In the Constructor"<<endl;
}
Line::~Line()
{
    cout<<"In the Destructor"<<endl;
}
int main()
{
    Line* objLine = NULL;
    Line::getInstance(objLine);
    return 0;
}

我读到当对象超出作用域时调用类的析构函数。在上面的代码对象是由objLine,这是一个局部变量处理。因此,在主函数的末尾,我期望析构函数被调用。但它从来没有被调用过。有谁能告诉我在上述情况下什么时候调用析构函数

在c++中,当变量超出作用域时调用析构函数,或者在使用new创建的对象上调用delete时调用析构函数。

您使用new创建对象,但从不使用delete,因此永远不会调用析构函数。

如果你的代码像这样:

int main() {
   Line objLine;
}

在这种情况下,您需要清理自己的内存

int main()
{
    Line* objLine = NULL;
    Line::getInstance(objLine);
    delete objLine;
    return 0;
}

这是因为您使用new来分配内存,所以它不会在超出作用域后自动清理自己。您需要使用delete

清理内存

正如@StefanoSanfilippo所提到的,您还需要将getInstance函数更改为

void Line::getInstance(Line*& objLine)

作用域规则适用于自动分配(即局部变量)。相反,您可以使用new操作符动态地分配Line的实例:

void Line::getInstance(Line* objLine)
{
    if(objLine == NULL)
    {
        objLine = new Line();
    }
}

动态分配的对象不绑定到作用域,必须使用delete操作符显式删除。此外,上面的方法正在泄漏内存:一旦离开函数,就会丢失对新创建对象的任何引用,因此无法访问或delete它。你需要修改传递给你的指针,例如修改代码如下:

void Line::getInstance(Line** objLine)
{
    if(objLine == NULL)
    {
        *objLine = new Line();
    }
}

现在你可以这样使用:

int main()
{
    Line* objLine = NULL;
    Line::getInstance(&objLine);
    // do something...
    delete objLine;
    return 0;
}