为什么在C ++中需要析构函数?

时间:2013-10-14 18:25:53

标签: c++ memory raii memory-management

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

我们可以使用

delete or delete[]   

当程序终止时,程序使用的所有内存是否都会被释放。

4 个答案:

答案 0 :(得分:5)

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

有了这个说法,你可以通过分配你可以在自动区域中分配的所有内容,而不用在C ++中使用析构函数。您真正需要使用动态内存的唯一时间是对象的生命周期必须超出其分配范围,但即使这样,C ++容器也会为您处理大部分分配(当然,标准容器的实现很大程度上依赖于C ++语言的构造函数/析构函数基础结构。)

答案 1 :(得分:2)

“我们使用析构函数来取消分配内存”

您实际撰写的内容是释放函数 operator deleteoperator delete[]

“当程序终止时,程序使用的所有内存是否都会被释放?”

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

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

答案 2 :(得分:2)

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

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

基本上,您可能需要阅读一些关于C ++的书来理解这个概念。我还写了一篇可能有用的文章,请参阅here

希望有所帮助:)

答案 3 :(得分:1)

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

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

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