在c++中调用类的析构函数时
When exactly destructor of a class invoked in 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;
}
我读到当对象超出作用域时调用类的析构函数。在上面的代码对象是由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;
}
相关文章:
- 析构函数调用
- 在具有向量的类构造函数中进行析构函数调用
- 从 c++ 中派生类的析构函数调用虚函数
- C++析构函数调用两次,堆栈分配的复合对象
- C++ 在析构函数调用之前删除的动态成员数组
- 析构函数调用c++中的一个向量
- Singleton模式中的手动析构函数调用:调用多次
- 从内部类的析构函数调用虚拟函数
- 与 boost odeint 集成期间的析构函数调用
- 堆栈展开如何与析构函数调用有关?
- C++:优化析构函数调用
- 以逗号分隔的表达式中的析构函数调用
- GCC 9.1 返回 void& 作为显式析构函数调用的结果类型。这是一个错误吗?
- 从C++中的虚拟析构函数调用虚拟方法
- 从指针返回对象时出现意外的析构函数调用
- 使用 decltype 显式析构函数调用
- C++析构函数调用了错误的对象
- 了解虚拟函数和析构函数调用
- 多重继承析构函数调用他自己和父析构函数?c++
- 析构函数调用表单不适当的库