删除已通过git clone克隆到git_repository的boost :: filesystem目录

时间:2013-11-12 13:55:08

标签: c++ git git-clone libgit2

我正在使用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存储库的目录时,代码可以正常工作,但在这种情况下使用它会崩溃。

2 个答案:

答案 0 :(得分:0)

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

我看到你在指针上调用git_repository_free(如果git_clone失败)未初始化。它知道如何为NULL做正确的事情,但如果在指针中发生了什么,它会很乐意尝试解除0xdeadbeef。这可能很容易导致您的崩溃。

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

答案 1 :(得分:0)

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