Externals  Version: 0.1.4 Revision: 541 Platform: x86 Build: 14:26 02.05.2020
Решение для сборки сторонних библиотек
GTest

Исходный код

Используется версия 1.7.0, т.к. в более поздних обнаружились проблемы.

Версия Проблема
1.8.0 Утечка памяти
r1928 Утечка памяти
1.10.0 Утечка памяти (исправлено в копии репозитория)
Заметки
Утечка памяти появляется только в тестовом проекте Alicorn (в отдельном проекте воспроизвести не удалось) при вызове функции
testing::InitGoogleTest(&argc, argv);

Утечка памяти

В версии 1.8.0+ появились утечки памяти, из-за чего пришлось создать зеркало репозитория, в которое внесены следующие правки:

  • В файле gtest-port.h закомментирован деструктор класса ThreadLocal.
  • В файле gtest-port.cc в функции GetThreadLocalsMapLocked() заменено создание объекта на
    static auto map = ::std::make_shared<ThreadIdToThreadLocals>();
    return map.get();
  • В файле gtest-port.cc в функции StartWatcherThreadFor() заменено:
    static ::std::map<DWORD, ::std::shared_ptr<ThreadIdAndHandle>> ThreadHandles;
    ThreadHandles[thread_id] =
    ::std::make_shared<ThreadIdAndHandle>(thread_id, thread);
    HANDLE watcher_thread = ::CreateThread(
    nullptr, // Default security.
    0, // Default stack size
    &ThreadLocalRegistryImpl::WatcherThreadFunc,
    //reinterpret_cast<LPVOID>(new ThreadIdAndHandle(thread_id, thread)),
    ThreadHandles[thread_id].get(),
    CREATE_SUSPENDED, &watcher_thread_id);