design-patterns - 软件架构中的析构函数模式
问题描述
正如工厂模式、建造者模式等都是创造模式一样。
是否存在任何析构函数模式?
如果有的话……说出一些。
解决方案
在像 C++ 这样具有手动内存管理的语言中,析构函数的存在是为了清理分配的对象、打开的文件句柄等资源。
如果对象A引用了对象B并且A对B的生命周期负责,那么在它的析构函数中A 必须调用delete B,因此它的析构函数被称为 an 等等。这确保了作为A的一部分分配的所有对象都被删除,并将内存返回给系统,否则会出现内存泄漏。
在具有自动内存管理(垃圾收集)的语言中,对象不需要删除它包含的其他对象,因为系统将删除所有未使用的对象。
在这些语言中,对象仍然可以分配资源,如文件、获取锁、启动计时器等,因此当不再需要它们释放这些资源时需要执行操作。
在这些语言中,使用了 Dispose 模式。
在一般情况下,此模式由释放这些资源且必须调用的方法(Close、Destroy、Release 等)组成。通常它用在 try {} catch{} finnaly {} 构造的 finnaly {} 块中。
C# 具有可与using声明一起使用的IDisposable接口,因此它具有对它的内置支持。
据我所知,我对 Java 没有太多经验,Java 7 引入了AutoClosable,但它与 try { } finally { } 一起使用
在 C# 中,您还可以添加一个终结器,而不是在对象被垃圾回收时调用。您可以使用此终结器来释放资源或添加断言对象在 GC 之前已正确处理以捕获错误。我用它来捕获分配重要资源的对象的错误,并且很难找出错误的来源。
推荐阅读
- sql-server - 创建表 6 x 6 并从上线自动溢出
- c - 使用 C 中的泰勒级数计算 sin(x) 和 cos(x)
- xml - XPath 查找文本拆分为多个后代
- javascript - 当有多个视频文件时如何定位视频元素。但也隐藏元素播放按钮并在视频结束时收听
- neo4j - 注册:Neo4j 显示空值
- javascript - React-router-V4 未将“match”属性传递给渲染组件
- database - Elasticsearch:基于过滤器构建二进制掩码
- django - django 创建新对象而不是更新
- iphone - 应用程序图标 iPhone 出错 - iTunes + Cordova + xCode
- javascript - 用javascript检测鼠标滚轮的类型(平滑与缺口)