Я не могу определенно быть уверенным, что это вызывает вашу конкретную проблему, потому что я не знаю остальную часть кода.Тем не менее, это должно определенно применяться в любом случае:
Статические или глобальные переменные типа класса запрещены: они вызывают жесткиенаходить ошибки из-за неопределенного порядка строительства и уничтожения.Объекты со статической продолжительностью хранения, включая глобальные переменные, статические переменные, статические переменные-члены класса и статические переменные функции, должны быть Plain Old Data (POD): только целые числа, символы, числа с плавающей запятой или указатели или массивы / структуры POD.
Порядок, в котором вызываются конструкторы классов и инициализаторы для статических переменных, только частично указан в C ++ и может даже меняться от сборки к сборке, что может вызвать ошибки, которые трудно найти.Поэтому, в дополнение к запрету глобальных типов класса, мы не разрешаем инициализировать статические переменные POD с результатом функции, если только эта функция (такая как getenv () или getpid ()) сама по себе не зависит от каких-либо других глобальных переменных..
Аналогично, порядок, в котором вызываются деструкторы, определяется как обратный порядку, в котором вызываются конструкторы.Так как порядок конструктора не определен, то и порядок деструктора.Например, во время завершения программы статическая переменная могла быть уничтожена, но все еще работающий код - возможно, в другом потоке - пытается получить к ней доступ и завершается неудачно.Или деструктор для статической переменной 'string' может быть запущен перед деструктором для другой переменной, которая содержит ссылку на эту строку.
В результате мы разрешаем только статическим переменным содержать данные POD.Это правило полностью запрещает vector (используйте вместо этого массивы C) или строку (используйте const char []).
Если вам нужна статическая или глобальная переменная типа класса, рассмотрите возможность инициализации указателя (который никогда не будетосвобожден), либо из вашей функции main (), либо из pthread_once ().Обратите внимание, что это должен быть необработанный указатель, а не «умный» указатель, поскольку деструктор умного указателя будет иметь проблему с порядком деструкторов, которую мы пытаемся избежать.
Короче говоря:Константы типа "строка" никогда не должны использоваться.Вы можете использовать что-то вроде