2016-12-31 3 views
1

私は、特定のlibgit2オブジェクトを解放するのが安全であることを理解しようとしています(ガベージコレクション言語用のバインディングを作成しています。 )。リポジトリがfree'dされた後、彼らは手動git_object_freeを持つユーザーによって閉じられますが、のいずれかをアクセスしているまで、それが生み出したすべてのオブジェクトがまだ存在すること安全に無料のlibgit2オブジェクト

注:git_repository_free状態のため

ドキュメントバッキングリポジトリのないオブジェクトの属性は未定義の動作になります

「属性」はここでは何を意味していますか? "git attributes"、つまりgit_attr_* functionsを参照しているようには見えません。これは、オブジェクトではなくリポジトリ自体のプロパティであるためです。

  1. これは私がそのリポジトリから任意のオブジェクトにgit_object_free以外の任意のメソッドを呼び出してはならないことを意味するのでしょうか?

  2. これは「gitオブジェクト」(タグ、コミット、ツリー、ブロブ)にのみ適用されますか?たとえば、git_repository_freeを呼び出した後にgit_repository_configで取得したgit_configを安全に使用できますか?

  3. 知っておく必要があるケースはありますか?

答えて

1

git_repository_free man pageがオブジェクト

属性のいずれかにアクセスして... "Gitの属性"(例えば.gitattributesとは何の関係も)

言及していませんこれはより一般的ですOOP term attribute

アトリビュート

これらは、オブジェクトに関する情報を格納します。上記の例では、fuelmaxSpeedが格納されています。
属性はクラスに関連付けられており、クラスのインスタンス(オブジェクト)が複数ある場合は、それぞれが独自のバージョンの変数を格納します。

commentedOP Simon Byrneによって、libgit2属性は直接公開されません。これらの属性から値を返すaccessor functionsが存在する場合でも、すべてのrepoオブジェクトが解放されても、結果は悪くなります。

オブジェクト属性にアクセスすると、のオブジェクトが占有しているメモリを解放すると、予期しない結果が発生します。

これらの属性に再度アクセスするには、別のGitリポジトリ(「バッキングリポジトリ」、解放したばかりのリポジトリのクローン)に対する有効なハンドルが必要です。したがって

  1. はい
  2. 番号:tests/object/lookup.cに示すように、唯一のgitリポジトリポインタに適用されます。別のものが解放されたgit_repositoryへの参照を保持しない限り、その他のオブジェクトは問題ありません。たとえば、*commitは単なる文字列です:あなたはまだ私はlibgit2で
+0

オブジェクトを見ることができない

  • (ただし、別のGitのレポで)それを使用することができますいずれかを公開していないので、すべての不透明な、とOOP属性。 –

  • +0

    @SimonByrneもちろん。私は答えを編集しました:もし解放されたgitリポジトリのアクセサ/メソッドを使ってこれらの属性にアクセス/使用すると、結果は悪くなります。その「属性」は '.gitattributes'とは関係がありません。 – VonC

    +0

    それは、1への答えがはいであることを意味しますか? 2および/または3についての任意のアイデア? –

    関連する問題