我正在使用boost :: filesystem和libgit2将git存储库克隆到我的电脑上。 一切正常,直到我完成并尝试删除我克隆存储库的目录。 这样做时我得到一个R6010 abort()。这是迄今为止的代码。
{
boost::filessytem::path dir("C:/myfolder");
boost::filesystem::create_directory(dir);
git_repository * repo;
git_clone_options option = GIT_CLONE_OPTIONS_INIT;
options.transport_flags = GIT_TRANSPORTFLAGS_NO_CHECK_CERT;
int error = git_clone(&repo, gitUrl.c_str(), "C:/myfolder", &option);
if(error != 0)
{
std::cout << giterr_last()->message;
}
//i)
git_repository_free(repo);
if(boost::filesytem::exists(dir))
{
//ii) boost::filesystem::remove_all(dir);
}
}
i)这行应该释放repo使用的内存,但似乎对问题没有影响。我是否使用它,git_repository__cleanup,或者根本没有。
ii)这是问题所在。删除没有克隆到它的git存储库的目录时,代码可以正常工作,但在这种情况下使用它会崩溃。
答案 0 :(得分:0)
giterr_last()
不分配或释放内存。它返回一个指向线程局部静态结构的指针。
我看到你在指针上调用git_repository_free
(如果git_clone
失败)未初始化。它知道如何为NULL
做正确的事情,但如果在指针中发生了什么,它会很乐意尝试解除0xdeadbeef
。这可能很容易导致您的崩溃。
不知道为什么你会在标记为ii
的地方发生崩溃,除非你的编译器正在优化某些东西。
答案 1 :(得分:0)
问题最终是libgit2将一些文件写为只读。 API不会让boost :: filesystem删除它们。