Статическая переменная в функции класса шаблона, перезаписанной глобальной статической переменной

У меня есть статическая переменная в функции класса шаблона, как это :

template<class T>
struct builder 
{
    static T* buildOrGet() 
    { 
        static T* built = nullptr;
        if(built == nullptr) built = new T;
        return built;
    }
};

а где-то еще в коде глобальная переменная с конструктором.

static SomeClass global_var;

Сначала я не знал, что произошло, но builtпеременная была повреждена в определенный момент программы без причины. Затем я добавил 4-байтовую точку останова данных в visual studio на&built, чтобы увидеть, кто сокрушил его память после built = new T;, и на самом деле это во время динамического инициализатора C++ при инициализации членовglobal_var, в SomeClassконструкторе.
Код находится в dll, автоматически загружается exe в зависимости от него.
Это как global_varпамять перекрывает builtпамять, что очень странно.

Я действительно не понимаю, почему и как это может произойти, кроме ошибки в Visual Studio 2015, Вы можете мне помочь ?

1 ответ

  1. Я нашел решение :
    На самом деле у меня есть несколько global_varс тем же именем в разных единицах перевода моей dll, но у них нет того же типа (скажем, у другого есть intтип).

    В этом случае (что странно для меня, потому что они «статические»), компоновщик просто сохраняет один и использует ту же память для всех переменных (он сохранил здесь intодин).

    Здесь все идет не так… Конструктор SomeClass по-прежнему вызывается для global_varI , упомянутого выше , но его памяти нетsizeof(SomeClass), ноsizeof(int), и именно здесь происходит переполнение .

    Для меня это ошибка, потому что компоновщик должен был заметить меня об этих омонимичных переменных с различными типами или/и должен был избежать вызова конструктора на переменную, которая не соответствует построенной памяти.

    Решение: никогда не объявляйте две статические переменные с одинаковым именем в разных единицах перевода, выживет только одна, и вы не сможете угадать, какая из них.