你如何在 C++ 中定义解构函数?
How do you define a deconstructor in c++?
刚开始学习 C++,我对如何编写解构函数感到困惑。到目前为止,我知道每当对象被销毁时都会调用解构函数,根据我的理解,这是程序结束并且 C++ 自动销毁所有对象的时间。这是否意味着我应该将所有变量重新初始化为它们原来的样子?
所以这是我应该拥有的:
/*In the Header file*/
List();
~List();
//Other function prototypes go here
/*In the Implementation file*/
List::List()
{
head = NULL;
tail = NULL;
count = 1;
}
List::~List
{
head = NULL;
tail = NULL;
count = 1;
}
//Other function bodies go here
没有。析构函数用于 deallocating/cleaning 对象可能正在使用的任何资源。例如需要关闭文件句柄,需要将 UI 资源释放回系统,需要 delete
ed delete
ed 的内存。
在你的例子中,计数看起来像一个 int
,所以你不需要为此做任何事情,因为它的内存是被销毁对象的一部分,但是如果你已经为你的列表你将不得不在析构函数中释放它。根据您构建列表的方式,您可能希望遍历列表并释放每个节点。
叫析构函数不叫析构函数
析构函数代码通常定义如何结束 class.
实例的生命周期
通常这将包括内存释放或释放以及资源释放'closing a file handle',解锁同步器,它还可能包括更复杂的东西,例如如果此线程生命周期在内部,则中断线程以结束其生命class.. 它可能不止于此,例如向已分配通知的任何人通知有关 class 的销毁.. 结束实例时可能需要很多代码class 如果没有析构函数,OOP 的封装会受到影响
C++ 中的最后一个注释,new 和 delete 保留字是使用对象实例 constructor/destructor 的内存分配器
我希望它足够清楚
为了消除一个误解,只要对象超出范围(局部变量到达创建它的代码块的末尾),就会调用析构函数。如果一个对象是在全局范围内(函数之外)创建的,它将在程序退出时被销毁。将其视为围绕整个程序的一大组括号。
void function(object a)
{
object b;
int x = 0;
while (x < 10)
{
object c;
// La la la Doing stuff.
} // c destroyed here. It will be created and destroyed for each run through the loop
a = b;
} //b destroyed here
// a also destroyed here, so watch out passing things into functions if you want them
// back changed.
或者用delete
命令手动销毁时
object * d = new object();
// la la la doing stuff
delete d;
由于d
是手动创建的,所以必须手动销毁。当心 C# 和 Java 人。
你需要在析构函数中做什么?
收起一切。不要浪费时间将值设置回默认值。他们待的时间不够长,无法欣赏这种姿态。但是,如果您打开了一个文件,并且它仍然处于打开状态,请将其关闭。如果您 new
编辑了其他对象,则 delete
它们。如果您锁定了互斥量,请将其解锁。如果您正在管理线程,您可能希望通知线程并等待它们完成后再完成。但是要超时,这样你就不会挂在卡住的线程上。
在我们讨论主题时,请阅读以下内容:What is The Rule of Three?
简单地说,三原则意味着如果你有一个析构函数、一个复制构造函数或一个赋值运算符 (operator=
),你几乎肯定需要这三个。很多时候你会看到人们因为不遵守三规则而出现奇怪的记忆错误。不要成为那个人。
当你有三法则时,去寻找五法则。
这如何适用于 OP:
List::~List
{
head = NULL; //very probably need to delete this pointer
tail = NULL; //and possibly this one
count = 1; // don't need this at all
}
所以它应该看起来像:
List::~List
{
if (head != NULL)
{
delete head; // This should start a chain reaction deleting all of the linked
// items in the list, ensuring that they have all been freed
}
}
此外,OP 应该有一个复制构造函数和一个赋值运算符,以确保在删除列表时它不会同时删除列表的任何副本的数据。
刚开始学习 C++,我对如何编写解构函数感到困惑。到目前为止,我知道每当对象被销毁时都会调用解构函数,根据我的理解,这是程序结束并且 C++ 自动销毁所有对象的时间。这是否意味着我应该将所有变量重新初始化为它们原来的样子?
所以这是我应该拥有的:
/*In the Header file*/
List();
~List();
//Other function prototypes go here
/*In the Implementation file*/
List::List()
{
head = NULL;
tail = NULL;
count = 1;
}
List::~List
{
head = NULL;
tail = NULL;
count = 1;
}
//Other function bodies go here
没有。析构函数用于 deallocating/cleaning 对象可能正在使用的任何资源。例如需要关闭文件句柄,需要将 UI 资源释放回系统,需要 delete
ed delete
ed 的内存。
在你的例子中,计数看起来像一个 int
,所以你不需要为此做任何事情,因为它的内存是被销毁对象的一部分,但是如果你已经为你的列表你将不得不在析构函数中释放它。根据您构建列表的方式,您可能希望遍历列表并释放每个节点。
叫析构函数不叫析构函数
析构函数代码通常定义如何结束 class.
实例的生命周期通常这将包括内存释放或释放以及资源释放'closing a file handle',解锁同步器,它还可能包括更复杂的东西,例如如果此线程生命周期在内部,则中断线程以结束其生命class.. 它可能不止于此,例如向已分配通知的任何人通知有关 class 的销毁.. 结束实例时可能需要很多代码class 如果没有析构函数,OOP 的封装会受到影响
C++ 中的最后一个注释,new 和 delete 保留字是使用对象实例 constructor/destructor 的内存分配器
我希望它足够清楚
为了消除一个误解,只要对象超出范围(局部变量到达创建它的代码块的末尾),就会调用析构函数。如果一个对象是在全局范围内(函数之外)创建的,它将在程序退出时被销毁。将其视为围绕整个程序的一大组括号。
void function(object a)
{
object b;
int x = 0;
while (x < 10)
{
object c;
// La la la Doing stuff.
} // c destroyed here. It will be created and destroyed for each run through the loop
a = b;
} //b destroyed here
// a also destroyed here, so watch out passing things into functions if you want them
// back changed.
或者用delete
命令手动销毁时
object * d = new object();
// la la la doing stuff
delete d;
由于d
是手动创建的,所以必须手动销毁。当心 C# 和 Java 人。
你需要在析构函数中做什么?
收起一切。不要浪费时间将值设置回默认值。他们待的时间不够长,无法欣赏这种姿态。但是,如果您打开了一个文件,并且它仍然处于打开状态,请将其关闭。如果您 new
编辑了其他对象,则 delete
它们。如果您锁定了互斥量,请将其解锁。如果您正在管理线程,您可能希望通知线程并等待它们完成后再完成。但是要超时,这样你就不会挂在卡住的线程上。
在我们讨论主题时,请阅读以下内容:What is The Rule of Three?
简单地说,三原则意味着如果你有一个析构函数、一个复制构造函数或一个赋值运算符 (operator=
),你几乎肯定需要这三个。很多时候你会看到人们因为不遵守三规则而出现奇怪的记忆错误。不要成为那个人。
当你有三法则时,去寻找五法则。
这如何适用于 OP:
List::~List
{
head = NULL; //very probably need to delete this pointer
tail = NULL; //and possibly this one
count = 1; // don't need this at all
}
所以它应该看起来像:
List::~List
{
if (head != NULL)
{
delete head; // This should start a chain reaction deleting all of the linked
// items in the list, ensuring that they have all been freed
}
}
此外,OP 应该有一个复制构造函数和一个赋值运算符,以确保在删除列表时它不会同时删除列表的任何副本的数据。