0

我正在使用 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 存储库的目录时有效,但在这种情况下使用时它会崩溃。

4

2 回答 2

0

giterr_last()不分配或释放内存。它返回一个指向线程局部静态结构的指针。

我看到您正在调用一个未初始化git_repository_free的指针(如果失败)。它git_clone知道如何为. 这很容易成为您崩溃的原因。NULL0xdeadbeef

不过,不知道为什么你会在标记的地方发生崩溃ii,除非你的编译器正在优化一些东西。

于 2013-11-12T17:50:17.063 回答
0

问题最终是 libgit2 将一些文件写入只读。API 不会让 boost::filesystem 删除它们。

于 2013-11-14T19:39:47.590 回答