Удаление каталога boost :: filessystem, для которого git_repository был клонирован с помощью git_clone

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) Эта линия должна освобождать память, используемую репо, но, похоже, не влияет на проблему. Использую ли я его, git_repository__cleanup или вообще ничего.

ii) Здесь находится проблема. Код работает при удалении каталога, у которого не было клонированного к нему репозитория git, но при его использовании в этом случае он сработает.

  • 0
    Ошибка все еще существует, когда вы не вызываете функции libgit2? Ошибка в библиотеке надстройки вообще не должна быть связана. Вы смотрели на это под отладчиком, чтобы увидеть, какой доступ к памяти вызывает его сбой?
  • 0
    Ускорение: код файловой системы работает самостоятельно. Сбой происходит только при попытке удалить каталог, в который был клонирован git-репозиторий. В итоге некоторые файлы были доступны только для чтения.
Теги:
git-clone
libgit2

2 ответа

0

Проблема закончилась тем, что libgit2 писал некоторые файлы только для чтения. API не позволит boost :: filesystem удалять их.

  • 0
    Если файл, доступный только для чтения, приводит к сбою надстройки, то это все еще ошибка надстройки, и она довольно серьезная.
0

giterr_last() не выделяет и не освобождает память. Он возвращает указатель на локальную статическую структуру потока.

Я вижу, что вы вызываете git_repository_free на указатель, который (если git_clone не работает) не инициализирован. Он знает, как правильно делать NULL, но он с удовольствием попытается устранить 0xdeadbeef если это произойдет в указателе. Это может быть причиной вашей аварии.

Не уверен, почему вы попали в столкновение в месте, отмеченном ii, хотя, если ваш компилятор не оптимизирует некоторые вещи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню