ポインタについて考える

  • (by K, 2021.10.14)

(1)

  • ガーベージコレクションは、結局のところfree(もしくはdelete)を自動化するためのものであって、それ以上を期待するべきではない。

(2)

  • メモリマネージャによる、自動deleteができたとして、残された問題は次の通り:
    • [1]もうfreeしてしまっているのに使おうとしていることを検出できるか?(低速モードだけでもいいから)
    • [2]freeし忘れを検出できるか?
  • [1]については、任意のポインタを渡されたとき、それが今でも有効かどうかを判定できれば良い。
    • もしポインタがリサイクルされるかもしれないことを考えると、リビジョンがなければいけない。
    • しかしリビジョンがつくとポインタが大きくなってしまう。ポインタの中に押し込むと、表現可能な範囲が減る。
    • リビジョンなしで近いことを実現するなら、ポインタの再利用をやめる、これしかない。
    • クラスや名前空間ごとに、ポインタの再利用をやめさせることができるようにする。
      • これのためには子供のライブラリも影響するのではないか。
      • 指定された親からのリクエストであれば、子供も同じように影響されるべき。
      • となれば、オブジェクトごとというか、利用ハンドルごとで、フラグを管理するべきだな。
  • [2]はあまり難しくない。リークしたもののリストがあればいいだけだから。newのときのコールスタックがあるといいのかな。

(3)

  • 未初期化と初期化済みの2状態があるのはどうか?(C++などの強制コンストラクタは、未初期化状態がない世界を目指している)
  • つまり初期化済みのリストがあればいい。初期化したものは未初期化に戻さなければいけない。
  • malloc/free と init/deinit を一緒にしないのはかなりいいアイデアかもしれない。

(4)

  • AEnter, ALeave を書くとコールスタックの準備や、mmの管理などをやってくれる。
    • pmm: 親のmm
    • lmm: life-time mm
    • mm: 自分

(5)

  • あるオブジェクトを開放するときに、ついでに開放してほしいオブジェクトがあるかもしれない。
  • あるオブジェクトをdeinitするとき、ついでにdeinitしてほしいオブジェクトがあるかもしれない。
  • しかしそういうことをすべてのオブジェクトに書くのは負担が大きい。
  • 拡張メンバというのはどうだろうか。これならオブジェクトにAIntを一つ足すだけで済む。
    • ASP0へのポインタが入る。
  • 拡張メンバは、ストリングIDとunion{ポインタ, AInt64, double};が組になったもの。
  • deinitやクラス別のfreeは、拡張メンバがどこにあるかをカスタマイズできる。どこかに、メンバから拡張メンバを取得する方法がある。

(6)

  • 一般DB
    • keyとvalが組になったもの。登録検索アルゴリズムは選択できる。
    • これなら細かいことを全部後から決められる。
  • StringIdも一般化するか。コンパイルオプションで選べるといい。
    • もしくは数値で選んでもいい。

(7)

  • まずmallocしてないものをfreeするとか(もしくはdouble-free)、initしてないものをdeinitするなどの検出は、key-valの一般DBで容易に実現できる。
  • StringIdがあれば、コールスタックを1つのidで管理できる。
  • AMM_initがあれば、コールスタック管理が入って、safeモードフラグかどうかも決まる。

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2021-10-15 (金) 14:39:11 (6d)