Skip to content

MemoryManagement

hikalium edited this page Aug 26, 2016 · 6 revisions

プールシステム

  • 変数プールとしてEListを用いる。
  • NV_Element構造体に、poolを保持する変数を用意する。
  • NV_Elementに対し、poolをセットする関数を用意する。
  • NV_Element_setPool(NV_Pointer e, NV_Pointer pool)
  • この関数は、removeData(e.pool, e), e.pool=pool, pool.pushData(e)を実行する
  • EListをfreeする際には、pool==そのリスト、もしくはpool==NULLである子をfreeしてゆく。freeは再帰的に実行される。
  • 削除条件が満たされない要素に関しては、その要素の子については探索しない。
  • プール設定は、明示的に指定しない限り自動的に上書きされない。つまり、リストに要素を追加しても、その要素の所属プールは追加先のリストとはならない。
  • ただし、どこにも所属しない要素(e.pool == NULL)ならば、親リストが解放された時に解放されるので、実質的に親リストをプールとしているかのようにあつかわれる。
  • NV_ListItem, NV_DictItemは、そのアイテムが所属するNV_ListもしくはNV_Dictが解放される時に、poolの設定にかかわらず解放される。

リストのクローン

  • プールが指定されていない要素に関しては、その要素を複製する。
  • プールが指定されている要素に関しては、その要素の参照を代入し、実体は複製しない。

リークを防ぐために

  • 新しい領域を、場合によって確保したり確保しなかったりする関数は危険。
  • 実行ツリーに残っていれば後で回収されるが、実行ツリーから外されたデータに関しては、後で回収されない。
  • 実行ツリーから外れているデータはまとめて代入、freeする。

OK

#a = 1


BAD

#a = 1
a = 5


Clone this wiki locally