在C++;? 我是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; } #包括 使用名称空间std; 班级线 { 私人: 第()行; 公众: 整数长度; 静态void getInstance(行*objLine); ~Line(); }; void行::getInstance(行*objLine) { if(objLine==NULL) { objLine=新行(); } } 行::行() { C++中的CUT,当变量超出范围时调用析构函数,或在< 新< /COD> < < /P>创建的对象上调用删除>代码> >
使用在C++;? 我是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; } #包括 使用名称空间std; 班级线 { 私人: 第()行; 公众: 整数长度; 静态void getInstance(行*objLine); ~Line(); }; void行::getInstance(行*objLine) { if(objLine==NULL) { objLine=新行(); } } 行::行() { C++中的CUT,当变量超出范围时调用析构函数,或在< 新< /COD> < < /P>创建的对象上调用删除>代码> >,c++,c++11,C++,C++11,使用new创建对象,但从不使用delete,因此从不调用析构函数 如果您的代码如下所示: int main() { Line objLine; } 析构函数被调用。在这种情况下,您需要清理自己的内存 int main() { Line* objLine = NULL; Line::getInstance(objLine); delete objLine; return 0; } 这是因为您使用了new来分配内存,因此它在超出范围后不会自动清理。您需要使用
new
创建对象,但从不使用delete
,因此从不调用析构函数
如果您的代码如下所示:
int main() {
Line objLine;
}
析构函数被调用。在这种情况下,您需要清理自己的内存
int main()
{
Line* objLine = NULL;
Line::getInstance(objLine);
delete objLine;
return 0;
}
这是因为您使用了new
来分配内存,因此它在超出范围后不会自动清理。您需要使用delete
来清理内存
如前所述,您还需要将getInstance
函数更改为
void Line::getInstance(Line*& objLine)
作用域规则对自动分配(即局部变量)有效。相反,您使用
new
运算符动态分配Line
的实例:
void Line::getInstance(Line* objLine)
{
if(objLine == NULL)
{
objLine = new Line();
}
}
动态分配的对象未绑定到作用域,必须使用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;
}
objLine
在main
结束时超出范围,但objLine
不是Line
的实例,它只是一个指针。因此指针在main
结束时超出范围。它没有析构函数。如果您编写了Line objLine
,则析构函数将作为objLine执行代码>超出范围。对于教育之外的软件,我建议使用共享指针,当变量超出范围时调用析构函数。实际上,这不起作用。objLine
通过值传递给getInstance
,它不会被修改,因此delete objLine
实际上将是一个call todelete NULL
,这会导致一个no op。作用域规则对静态分配有效
实际上,静态分配的对象不会在作用域结束时被销毁。它们在main
返回后被销毁。您可能指的是自动(堆栈)分配。@User207933我指的是静态(在编译时)与动态(如在运行时)相反,是的,自动更正确,我也相应地编辑了这篇文章。我认为“自动存储”对新手来说可能听起来有点奇怪。