安全地释放libgit2对象

时间:2016-12-31 13:40:33

标签: libgit2

我试图了解何时释放某些libgit2对象是安全的(我为垃圾收集语言编写绑定,并且需要跟踪哪些对象需要保留对其他对象的引用)。

git_repository_free州的文档:

  

请注意,在存储库空闲后,它产生的所有对象仍然存在,直到用户使用git_object_free手动关闭它们,但访问对象的任何属性而没有支持存储库将导致未定义的行为

"属性"这意味着什么它似乎没有引用" git属性",即git_attr_* functions,因为它们是存储库本身的属性,而不是对象。

  1. 这是否意味着我不应该在该存储库中的任何对象上调用git_object_free以外的任何方法?

  2. 这是否仅适用于" git对象" (即标签,提交,树木和斑点)?例如,我可以在致电git_config后安全地使用通过git_repository_config获得的git_repository_free吗?

  3. 还有其他需要注意的案例吗?

1 个答案:

答案 0 :(得分:1)

git_repository_free man page未提及" git属性" (例如与.gitattributes无关)

  

...访问对象的任何属性

这是更通用的OOP term attribute

  

属性

     

这些存储有关对象的信息。在上面的示例中,我们存储了fuelmaxSpeed   属性附加到类,如果有几个类的实例(对象),那么每个都将存储它们自己的这些变量的版本。

commentedOP Simon Byrne,libgit2属性不会直接公开。如果有accessor functions从这些属性返回值,如果释放了所有repo对象,仍然会得到错误的结果。

在释放该对象占用的内存后访问对象属性将导致不可预测的结果。

您应该拥有另一个Git仓库的有效句柄("支持存储库",您刚刚释放的存储库的克隆),以便再次访问这些属性。

所以:

  1. 否:仅适用于git-repository指针,如tests/object/lookup.c所示。只要另一个不保留对刚被释放的git_repository的引用,那另一个对象就可以了。例如,*commit只是一个字符串:您仍然可以使用它(但使用另一个git仓库)
  2. 不是我能看到