У меня есть статической переменной в функции класса шаблон:статическая переменная в функции шаблонного класса перезаписаны глобальной статической переменной
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, вы можете мне помочь?
Можете ли вы дать более подробную информацию, в частности о SomeClass? В частности, существует ли вероятность того, что в его конструкторе произойдет незаконная операция записи? – Eternal
на самом деле 'SomeClass' имеет некоторые члены данных, и когда была остановлена точка останова данных, я смотрел адрес своих членов для текущего экземпляра, а один из них был адресом' built' + 1, это означает, что память, занятая ' global_var' перекрывает 'встроенную 'память. И члены просто инициализированы, они не перезаписывают какую-либо память (в сборке код, в котором срабатывает точка останова, соответствует инициализации члена: что-то вроде: move rcx this mov rcx + 28h 0 <- точка прерывания данных, вызванная здесь – Juicebox
I ставка, которую вы здесь описываете, на самом деле не является самой проблемой, а скорее следствием повреждения памяти (что происходит где-то раньше). –