我下的tango-0.99.1-bin-win32-dmd.1.021为啥运行不了垃圾收集?
tomqyp
2007-10-22
redsea 写道 Sorry, 我应该不是在D里面看到的文档, 应该是在 Java 里面的.
不过情况是类似的. 不能依靠 gc 调用析构函数来释放非内存资源的原因在于: 1. gc 不一定是什么时候发生. 可能要隔很长时间, 这和 gc 有关; 也可能对象本身已经不用了, 但是有一个对象还指着它没释放有关. 2. gc 不一定发生. Java 是非保守 gc 都这样说明, D 语言是保守 gc, 更有可能碰到实际已经不用的内存, 而不释放的情况. 这样, 用 gc 管理非内存资源, 例如数据库连接, 都会使得昂贵的资源无法得到释放. 好的解决方法应该是, 有一个资源释放函数, 这个函数在资源已经释放掉的时候再次调用, 不会出错. 程序员知道资源已经使用完毕的时候, 调用这个释放函数. 析构函数里面也调用这个释放函数. 这样, 对这个对象用 scope 修饰, RAII 用法也成, 手工析构也成. 但是如果不是 scope 变量, 等待 gc 调用析构, 则不妥. 谢谢 明白了 |