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

Я использую boost :: filesystem и libgit2 для клонирования git-репозитория на мой компьютер.
Все работает нормально, пока я не закончу и не попытаюсь удалить каталог, в который я клонировал хранилище.
При этом я получаю прерывание R6010 (). Вот код до сих пор.

{

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

Решение

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

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

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

0

Другие решения

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

0

По вопросам рекламы [email protected]