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