-3

为什么我们必须在 C++ 中使用析构函数来释放内存,

正如我们可以使用

delete or delete[]   

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

4

4 回答 4

5

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

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

于 2013-10-14T18:29:40.713 回答
2

“我们使用析构函数来释放内存”

你实际写的是释放函数 operator deleteoperator delete[].

“一个程序用完的内存不是都在程序终止时释放吗?”

AFAIK 这是特定于操作系统的,但重点不是程序终止后会发生什么。重点是关于执行期间发生的事情。有许多应用程序运行了几个小时甚至几周,内存泄漏可能会在这些应用程序中产生非常不愉快的后果(并不是说内存泄漏不会对其他程序造成不愉快)。

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

于 2013-10-14T18:29:01.617 回答
2

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

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

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

希望能帮助到你 :)

于 2013-10-14T18:31:46.533 回答
1

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

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

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

于 2013-10-14T18:30:26.923 回答