我下的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 调用析构, 则不妥.


谢谢  明白了
Global site tag (gtag.js) - Google Analytics