为什么析构函数在C++中是必需的

Why are destructors necessary in C++?

本文关键字:析构函数 C++ 为什么      更新时间:2023-10-16

为什么我们必须在 C++ 中使用析构函数来取消分配内存,

正如我们可以使用的

delete or delete[]   
当程序

终止时,程序用完的所有内存都被释放,这不是真的吗?

通常,仅在程序终止后恢复内存是不够的。大多数为连续运行而设计的程序都需要分配可变大小的临时内存,而该内存的生存期没有特定的名声。很明显,如果您请求内存并且在很长一段时间内不返回内存,则程序将耗尽内存,并在请求额外内存时终止。

话虽如此,通过分配可以在自动区域中分配的所有内容,您可以在不使用析构函数的情况下走很长一段路C++。真正需要使用动态内存的唯一时间是对象的生存期必须超出其分配范围,但即便如此,C++容器也会为您处理大多数分配(当然,标准容器的实现在很大程度上依赖于C++语言的构造函数/析构函数基础结构)。

"我们使用析构函数来解除分配内存"

您实际上正在写的是operator deleteoperator delete[]释放函数

"程序用完的所有内存在程序终止时被释放,这难道不是真的吗?"

AFAIK 这是特定于操作系统的,但重点不是程序终止后会发生什么。关键是关于执行过程中会发生什么。有许多应用程序运行数小时甚至数周,内存泄漏可能会在这些应用程序中产生非常不愉快的后果(并不是说内存泄漏在其他程序方面不会令人不快)。

当你的程序达到不再需要你分配的资源的地步时,你应该尽最大努力使用适当的方式释放它们。一旦你的程序终止:依靠操作系统清理你的烂摊子似乎不是一个好的做法;)

如果使用 RAII,则保证调用析构函数。这并不是说我们必须使用它,但是从RAII中受益通常是一个好主意,因为它允许自动资源管理。换句话说,如果你正确地编写了你的程序,它就不会有资源或内存泄漏,所以你甚至不必担心它。

这不仅适用于C++,也适用于支持自动资源管理的其他语言,例如 C#、Java 甚至 C(通过非标准扩展)。

基本上,您可能需要阅读一些关于C++的书籍才能理解这个概念。我还写了一篇可能会有所帮助的小文章,请参阅此处。

希望对:)有所帮助

首先,deletedelete[] 不是析构函数,它们只是调用被删除的实例的析构函数(假设这些实例确实有析构函数)。

回答你更大的问题:类的析构函数可以做的不仅仅是释放内存。例如,它可能会向另一个程序发出信号,表明它即将关闭连接或其他东西。

此外,有些程序"永远"运行 - 或者至少尽可能长时间运行。例如,我开发在服务器上运行的程序,它们(希望)运行一个月。我确实需要尽快释放内存(或其他资源),否则当计算机内存不足时,进程将增长并最终崩溃。