Сбой встроенной глобальной переменной в заголовке включен несколько раз - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть вопрос о встроенном поведении глобальных переменных в c ++ 17, они, кажется, не работают, как я понимаю.Простая программа вылетает при выходе.

Создание переменной extern вместо inline и определение ее в файле .cpp решает проблему, но мне интересно, почему это происходит в первую очередь.

Может кто-нибудь объяснить, почему следующее дает исключение?

SomeSharedInclude.h

#pragma once
#include <unordered_set>

namespace Stuff
{
inline std::unordered_set<int> global_set;
}

main.cpp

##include "SomeSharedInclude.h"

int main() {}

OtherSource.cpp

##include "SomeSharedInclude.h"

class Test {};

После выхода из программы происходит следующее:

Exception thrown: read access violation. _Pnode was 0xDDDDDDDD

Верхняя часть стека вызовов:

TestGlobalInline.exe!std::list<int,std::allocator<int> >::clear() Line 1392
TestGlobalInline.exe!std::list<int,std::allocator<int> >::_Tidy() Line 1775
TestGlobalInline.exe!std::list<int,std::allocator<int> >::~list<int,std::allocator<int> >() Line 983
TestGlobalInline.exe!std::_Hash<std::_Uset_traits<int,std::_Uhash_compare<int,std::hash<int>,std::equal_to<int> >,std::allocator<int>,0> >::~_Hash<std::_Uset_traits<int,std::_Uhash_compare<int,std::hash<int>,std::equal_to<int> >,std::allocator<int>,0> >()
TestGlobalInline.exe!std::unordered_set<int,std::hash<int>,std::equal_to<int>,std::allocator<int> >::~unordered_set<int,std::hash<int>,std::equal_to<int>,std::allocator<int> >()
TestGlobalInline.exe!Stuff::`dynamic atexit destructor for 'global_set''()
ucrtbased.dll!54205f52()

Это в сообществе Visual Studio 15.9.7

Я пробовал другие типы для глобальной переменной, такие как std :: {string, vector, stack}, пока что только unordered_set, unordered_map и list crash.


Хорошо, похоже, это ошибка Visual Studio, где деструкторы вызываются несколько раз для глобальных встроенных переменных, и эти классы (std :: unordered_set и т. Д.) Дают исключение, когда это происходит (остальныекак std :: vector, я не проверял).

...