Если я создаю простую библиотеку (созданную с использованием CMake):
foo.h
#pragma once
#include <functional>
void foo(std::function<void()> handler);
foo.cpp
#include "foo.h"
void foo(std::function<void()> handler)
{
handler();
}
И затем создайте отдельный проект CMake, компилирующий исполняемый файл:
#include "foo.h"
#include <cstdlib>
#include <iostream>
int main()
{
foo([&]()
{
std::cout << "hello" << std::endl;
});
return EXIT_SUCCESS;
}
И затем скомпилируйте библиотеку, используя MSVC (используя последний SDK платформы 10.0.17134.12) в Release или RelWithDebInfo (помните, яя использую CMake), и я компилирую исполняемый файл с использованием Clang 6 (Clang 5 не поддерживается с последней версией Windows Platform SDK, поставляемой в комплекте с Visual Studio 17.7 https://blogs.msdn.microsoft.com/vcblog/2018/05/07/announcing-msvc-conforms-to-the-c-standard/), также использующей Release или RelWithDebInfo, затем я получаю повреждение кучи, вызванноеstd::function
деструктор.
Чтобы надежно вызвать повреждение кучи, я могу использовать gflags
.
gflags -p /enable "myexe.exe" /full
Он отлично работал с Clang 5 на предыдущей платформе SDK (стандартный Clang доступен для скачиванияот LLVM, а не от версии Microsoft.) Я предполагаю, что это проблема или ошибка ABI (или аналогичная). Потребовалось некоторое время, чтобы разобрать все это и получить минимально проверяемое воспроизведение. У кого-нибудь естьny предложения о том, где его взять отсюда?