为什么析构函数在C++中是必需的
Why are destructors necessary in C++?
为什么我们必须在 C++ 中使用析构函数来取消分配内存,
正如我们可以使用的
delete or delete[]
当程序终止时,程序用完的所有内存都被释放,这不是真的吗?
通常,仅在程序终止后恢复内存是不够的。大多数为连续运行而设计的程序都需要分配可变大小的临时内存,而该内存的生存期没有特定的名声。很明显,如果您请求内存并且在很长一段时间内不返回内存,则程序将耗尽内存,并在请求额外内存时终止。
话虽如此,通过分配可以在自动区域中分配的所有内容,您可以在不使用析构函数的情况下走很长一段路C++。真正需要使用动态内存的唯一时间是对象的生存期必须超出其分配范围,但即便如此,C++容器也会为您处理大多数分配(当然,标准容器的实现在很大程度上依赖于C++语言的构造函数/析构函数基础结构)。
"我们使用析构函数来解除分配内存"
您实际上正在写的是operator delete
和operator delete[]
的释放函数。
"程序用完的所有内存在程序终止时被释放,这难道不是真的吗?"
AFAIK 这是特定于操作系统的,但重点不是程序终止后会发生什么。关键是关于执行过程中会发生什么。有许多应用程序运行数小时甚至数周,内存泄漏可能会在这些应用程序中产生非常不愉快的后果(并不是说内存泄漏在其他程序方面不会令人不快)。
当你的程序达到不再需要你分配的资源的地步时,你应该尽最大努力使用适当的方式释放它们。一旦你的程序终止:依靠操作系统清理你的烂摊子似乎不是一个好的做法;)
如果使用 RAII,则保证调用析构函数。这并不是说我们必须使用它,但是从RAII中受益通常是一个好主意,因为它允许自动资源管理。换句话说,如果你正确地编写了你的程序,它就不会有资源或内存泄漏,所以你甚至不必担心它。
这不仅适用于C++,也适用于支持自动资源管理的其他语言,例如 C#、Java 甚至 C(通过非标准扩展)。
基本上,您可能需要阅读一些关于C++的书籍才能理解这个概念。我还写了一篇可能会有所帮助的小文章,请参阅此处。
希望对:)有所帮助
首先,delete
和 delete[]
不是析构函数,它们只是调用被删除的实例的析构函数(假设这些实例确实有析构函数)。
回答你更大的问题:类的析构函数可以做的不仅仅是释放内存。例如,它可能会向另一个程序发出信号,表明它即将关闭连接或其他东西。
此外,有些程序"永远"运行 - 或者至少尽可能长时间运行。例如,我开发在服务器上运行的程序,它们(希望)运行一个月。我确实需要尽快释放内存(或其他资源),否则当计算机内存不足时,进程将增长并最终崩溃。
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- C++成员的析构函数顺序与shared_ptr
- C++ 防止在映射中放置()时调用析构函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 调用析构函数以释放动态分配的内存
- 不命名构造函数和析构函数上的类型错误