IBM DOORS Attribute DXL资源释放咨询:需释放哪些资源?
IBM DOORS Attribute DXL 资源释放最佳实践答疑
一、哪些句柄需要手动释放?
DXL并非所有类型都需要手动管理内存,以下几种必须手动释放:
- Buffer:通过
create显式创建的Buffer对象 - ModName_:通过
data()、module()等方法获取的模块引用句柄 - LinkRef/Link:遍历链接时获取的链接句柄
- Module:通过
open()打开的模块实例(注意用close()而非delete)
而string这类基础字符串类型不需要手动处理,DXL会自动通过引用计数回收内存,你代码里给string赋值null的操作完全多余。
二、你的代码问题修正
Buffer操作的错误修正
你原来的Buffer代码存在致命问题:第一次delete(buff)后,buff已经是无效句柄,后续调用tempStringOf(buff)会触发崩溃或异常。正确的写法是先使用Buffer内容,再释放:
Buffer buff = create buff = "hello" obj.attrDXLName = tempStringOf(buff) // 先读取内容 delete(buff) // 用完立即释放,仅需一次
链接遍历的句柄释放
你代码中对otherModuleHandle调用delete()是正确的——通过data(SourceVersion myLinkRef)获取的ModName_句柄必须手动释放,否则会造成内存泄漏。如果是打开的Module对象,记得用close(m)关闭,而非delete。
三、最佳释放原则
- 先使用后释放:永远不要在还需要使用句柄的时候调用
delete或close - 成对操作:创建/获取句柄后,在代码块结束或不再使用的第一时间释放,尤其是循环遍历场景(比如遍历大量链接、模块对象),避免内存累积泄漏
- 区分操作:Module用
close(),Buffer/ModName_/LinkRef用delete(),不要混用
四、内存模型与delete的工作原理
DOORS DXL确实采用引用计数内存模型:
- 每个可释放的句柄对象都有引用计数,创建或复制句柄时计数+1,调用
delete时计数-1 - 当引用计数降到0时,系统会自动回收该对象占用的内存
- 但DXL的自动回收仅覆盖部分基础类型(如string),像Buffer、ModName_这类显式获取的资源,不会自动触发计数归零,必须手动调用
delete,否则这些资源会一直占用内存,直到DOORS进程结束。
内容的提问来源于stack exchange,提问作者Rumex
相关产品推荐
相关产品推荐

