什么时候在C ++中调用类的析构函数?

时间:2015-06-08 11:10:19

标签: c++ c++11

我是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处理,objLine是一个局部变量。因此,在主要结束时,我预计会调用析构函数。但它永远不会被调用。在上面的案例中调用析构函数时,请告诉我

3 个答案:

答案 0 :(得分:8)

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

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

如果你的代码是这样的:

int main() {
   Line objLine;
}

调用析构函数。

答案 1 :(得分:2)

在这种情况下你需要清理自己的记忆

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

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

清理内存

如上所述@StefanoSanfilippo,您还需要将getInstance功能更改为

void Line::getInstance(Line*& objLine)

答案 2 :(得分:2)

范围规则对自动分配(即局部变量)有效。相反,您使用Line运算符动态分配new的实例:

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;
}