Rob*_*cks 1 oop garbage-collection instances
你可以创建新的对象,但是当你使用它们时,也没有真正的方法可以立即销毁它们吗?
为什么每个OOP运行时都没有实现这样的行为?
我确信我们开发人员可以(通常)组织对象实例在我们使用它们时被销毁.
function work(){
var p1:Point = new Point(x, y);
var p2:Point = new Point(x2, y2);
....
destroy p1;
destroy p2;
}
Run Code Online (Sandbox Code Playgroud)
从.NET讲,答案是内存安全.
考虑两个项目A和B(对象或方法)都持有对象X的引用.
现在A做了一个destroy X;.然后B留下无效的引用.这是非托管语言中的常见错误模式.删除手动销毁可防止这种情
但同样重要的问题是:它会有多大帮助吗?答案是不.短暂的内存在.NET中非常便宜.你提议的破坏不具有任何价值.
简而言之,因为这通常使编程任务复杂化.手动内存管理需要相当多的技能和努力才能正确使用 - 您无法使用的工作量来完成您要解决的实际任务.
您在上面展示的场景很常见,但远非唯一的场景.如果您返回对其中一个对象的引用怎么办?如果您传递对被调用方法的引用(可能存储它的位置),该怎么办?等等.在您负责任地销毁对象之前,这些都是您需要考虑的问题.这些被称为"所有权".
硬币的另一面是,它能否在执行期间在指定点销毁对象真的有积极作用吗?这使得析构函数和C++中的RAII成为可能,这是一个非常强大的习惯用法.Java没有它,当我开始使用Java时,我经常错过它.但是,有一些方法可以在Java中有效地解决这些问题(例如finally块).然而,优雅的RAII,它仍然不会支付手动内存管理可能导致的整个混乱.
然后你可能会建议,"为什么我们不能同时拥有:当我想要显式销毁对象时,以及其余的垃圾收集?".你可以在编译器编写者和JVM实现者得到你之前开始运行求助:-)这会使事情变得如此复杂,如果没有真正巨大的实际好处,没有人会这样做.手动内存管理不提供这样的功能.