Я использую 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-репозиторий, но при использовании в этом случае происходит сбой.
giterr_last()
не выделяет и не освобождает память. Возвращает указатель на локальную потоковую статическую структуру.
Я вижу, что ты звонишь git_repository_free
по указателю, что (если git_clone
не удается) неинициализирован. Он знает, как сделать правильную вещь для NULL
, но он с радостью попытается разузнать 0xdeadbeef
если это то, что происходит в указателе. Это может легко стать причиной вашей аварии.
Не знаю, почему вы получите аварию в месте, отмеченном ii
Однако, если ваш компилятор не оптимизирует некоторые вещи.
В итоге проблема заключалась в том, что libgit2 записывал некоторые файлы только для чтения. API не позволит boost :: filesystem удалить их.