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