我下的tango-0.99.1-bin-win32-dmd.1.021为啥运行不了垃圾收集?
ahadf
2007-10-21
确实是。那么点内存等进程结束时释放也不要紧,但无法调用析构函数多少就让人惊讶了。
|
|
redsea
2007-10-22
文档中本来就有说, 非内存资源不应该用 gc 去释放.
Java 也是这样说的. tomqyp 写道 我觉得如果不把这个视为BUG的话,至少应该在相关文档中说明。
假如要释放的不是一块内存,甚至不是本地资源,例如在一个C/S结构的系统中,遇到这种情况服务端可能永远不知道这些资源可以释放了。 |
|
tomqyp
2007-10-22
redsea 写道 文档中本来就有说, 非内存资源不应该用 gc 去释放.
Java 也是这样说的. 谢谢 受教了,看来我还要再认真读读文档 |
|
tomqyp
2007-10-22
不对啊,我仔细想了一下,D中释放资源的机会无非下面几种情况
1、手动释放 2、RAII 3、scope D应该是推荐用RAII来管理资源的,而RAII的一般做法就是在对象析构的时候释放资源,如果析构不能正常调用RAII又从何说起呢? 英文不大好查找起来很吃力,redsea先生能不能详细引用一下文档中这方面的说明。 |
|
ahadf
2007-10-22
在D中RAII==scope.
|
|
redsea
2007-10-22
Sorry, 我应该不是在D里面看到的文档, 应该是在 Java 里面的.
不过情况是类似的. 不能依靠 gc 调用析构函数来释放非内存资源的原因在于: 1. gc 不一定是什么时候发生. 可能要隔很长时间, 这和 gc 有关; 也可能对象本身已经不用了, 但是有一个对象还指着它没释放有关. 2. gc 不一定发生. Java 是非保守 gc 都这样说明, D 语言是保守 gc, 更有可能碰到实际已经不用的内存, 而不释放的情况. 这样, 用 gc 管理非内存资源, 例如数据库连接, 都会使得昂贵的资源无法得到释放. 好的解决方法应该是, 有一个资源释放函数, 这个函数在资源已经释放掉的时候再次调用, 不会出错. 程序员知道资源已经使用完毕的时候, 调用这个释放函数. 析构函数里面也调用这个释放函数. 这样, 对这个对象用 scope 修饰, RAII 用法也成, 手工析构也成. 但是如果不是 scope 变量, 等待 gc 调用析构, 则不妥. tomqyp 写道 不对啊,我仔细想了一下,D中释放资源的机会无非下面几种情况
1、手动释放 2、RAII 3、scope D应该是推荐用RAII来管理资源的,而RAII的一般做法就是在对象析构的时候释放资源,如果析构不能正常调用RAII又从何说起呢? 英文不大好查找起来很吃力,redsea先生能不能详细引用一下文档中这方面的说明。 |
|
Colorful
2007-10-22
redsea 写道 Sorry, 我应该不是在D里面看到的文档, 应该是在 Java 里面的.
不过情况是类似的. 不能依靠 gc 调用析构函数来释放非内存资源的原因在于: 1. gc 不一定是什么时候发生. 可能要隔很长时间, 这和 gc 有关; 也可能对象本身已经不用了, 但是有一个对象还指着它没释放有关. 2. gc 不一定发生. Java 是非保守 gc 都这样说明, D 语言是保守 gc, 更有可能碰到实际已经不用的内存, 而不释放的情况. 这样, 用 gc 管理非内存资源, 例如数据库连接, 都会使得昂贵的资源无法得到释放. 好的解决方法应该是, 有一个资源释放函数, 这个函数在资源已经释放掉的时候再次调用, 不会出错. 程序员知道资源已经使用完毕的时候, 调用这个释放函数. 析构函数里面也调用这个释放函数. 这样, 对这个对象用 scope 修饰, RAII 用法也成, 手工析构也成. 但是如果不是 scope 变量, 等待 gc 调用析构, 则不妥. tomqyp 写道 不对啊,我仔细想了一下,D中释放资源的机会无非下面几种情况
1、手动释放 2、RAII 3、scope D应该是推荐用RAII来管理资源的,而RAII的一般做法就是在对象析构的时候释放资源,如果析构不能正常调用RAII又从何说起呢? 英文不大好查找起来很吃力,redsea先生能不能详细引用一下文档中这方面的说明。 请教个问题。 我采用资源释放函数之后,如何防止GC再次调用析构函数呢? 这可能不算是个大问题,因为资源释放函数肯定会写成多次安全调用的,但是如果不在析构函数调用资源释放函数,又有可能会造成隐患。 |
|
Colorful
2007-10-22
相对来说,scope可能是个比较好的办法!
|
|
ahadf
2007-10-22
把对象delete掉。
|
|
redsea
2007-10-22
Colorful 写道 请教个问题。 我采用资源释放函数之后,如何防止GC再次调用析构函数呢? 这可能不算是个大问题,因为资源释放函数肯定会写成多次安全调用的,但是如果不在析构函数调用资源释放函数,又有可能会造成隐患。 这个, D 目前的实现应该没有办法替你做到, 除非你自己加代码判断了. |