跳转到内容

BlitzMax/语言/内存管理

来自维基教科书,开放的书籍,开放的世界

BlitzMax 目前使用优化后的引用计数来实现内存管理。

但是,在处理循环数据结构时,需要特别注意内存管理。

循环数据结构是一种数据结构(在 BlitzMax 中,是用户定义的类型),它可能“指向自身”。循环数据结构最极端的例子是

Type TCyclic
Field cycle:TCyclic=Self
End Type

For k=1 To 10
Local cyclic:TCyclic=New TCyclic
GCCollect
Print GCMemAlloced()
Next

运行此程序后,您会注意到内存正在缓慢泄漏。这是因为每个 TCyclic 对象的引用计数永远不会达到 0,这是由于对象的“循环”字段。

因此,必须确保此类循环数据结构得到干净的处理。这可以通过添加一个方法来“解除链接”任何此类循环来实现。例如

Type TCyclic
Field cycle:TCyclic=Self

Method Remove()
cycle=Null
End Method

End Type

For k=1 To 10
Local cyclic:TCyclic=New TCyclic
GCCollect
Print GCMemAlloced()
cyclic.Remove
Next

在实际应用中,这个问题很少出现,出现时通常是在设计容器类型时。

如果您对此有任何担忧,您可以使用 BlitzMax 运行时库中的 GCMemAlloced() 函数轻松跟踪内存使用情况。

华夏公益教科书