2016-12-31 32 views
1

我想了解何時釋放某些libgit2對象是安全的(我正在爲垃圾收集語言編寫綁定,並且需要跟蹤哪些對象需要保持對其他對象的引用)。安全地釋放libgit2對象

注意,一個倉庫後free'd,仍然會存在,催生的所有對象,直到它們由用戶手動關閉與git_object_free,但訪問任何的:

git_repository_free狀態的文檔沒有後備存儲庫的對象的屬性將導致未定義的行爲

「屬性」在這裏意味着什麼?它似乎沒有提到「git屬性」,即git_attr_* functions,因爲這些屬性是存儲庫本身的屬性,而不是對象。

  1. 這是否意味着我不應該叫比git_object_free其他任何方法從該庫的任何對象?

  2. 這隻適用於「混帳對象」(即標籤,提交,樹木和斑點)?例如,我可以在撥打git_repository_free之後安全地使用通過git_repository_config獲得的git_config嗎?

  3. 是否還有其他需要注意的情況?

回答

1

git_repository_free man page沒有提到 「混帳屬性」

(自認倒黴.gitattributes比如做)......訪問任何屬性的對象

這是更通用的OOP term attribute

屬性

這些存儲關於對象的信息。在上面的例子中,我們存儲了fuelmaxSpeed
屬性被附加到類中,如果有多個類的實例(對象),則每個類將存儲它自己的這些變量版本。

由於commentedOP Simon Byrne,libgit2屬性不直接公開。如果有accessor functions從那些屬性返回值,如果全部回購對象被釋放,你仍然會得到不好的結果。

訪問後的對象屬性釋放該對象佔用的內存將導致不可預知的結果。

爲了再次訪問這些屬性,你應該有一個有效的句柄來處理另一個Git倉庫(一個「後備倉庫」,這是你剛剛釋放倉庫的一個克隆)。

所以:

  1. 號:僅適用於一個Git存儲庫的指針,如圖tests/object/lookup.c。只要另一個對象沒有保留對剛纔釋放的git_repository的引用,那另一個對象就沒有問題。例如,*commit只是一個字符串:你仍然可以使用它(但與另一個混帳回購協議)
  2. 不,我可以看到
+0

在libgit2的對象都是不透明的,所以不要暴露任何OOP屬性。 –

+0

@SimonByrne當然。我已經編輯了答案:如果你通過訪問器/方法訪問/使用那些已釋放的git倉庫中的屬性,結果將會很糟糕。關鍵是:這些「屬性」與'.gitattributes'無關。 – VonC

+0

那麼這是否意味着答案是肯定的?任何關於2和/或3的想法? –