跳轉到內容

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() 函式輕鬆跟蹤記憶體使用情況。

華夏公益教科書