Я задал этот вопрос вчера, что приводит к сегодняшнему вопросу (косвенно).Я получал повреждение кучи с помощью следующего кода:
typedef struct
{
void SetPos(const Vector2& pos)
{
m_var1 = pos[0];
m_var2 = pos[1];
}
Vector2 GetPos() const
{
return Vector2(m_var1, m_var2);
}
union
{
f32 m_var1;
f32 m_var1DiffName;
};
union
{
f32 m_var2;
};
}StructBase;
typedef struct Struct1 : public StructBase
{
Vec4f m_foo;
} Struct1;
typedef struct Struct2 : public StructBase
{
Vector2 m_foofoo;
} Struct2;
typedef struct Struct3 : public StructBase
{
Struct3()
{
SetPos(Vector2(0, 0));
}
Struct3(const Vector2& pos)
{
SetPos(pos);
}
} Struct3;
Каждый раз, когда я добавлял Struct3 в массив (вектор <>), отладчик прерывал сигнализацию повреждения кучи.Если бы я отключил обнаружение повреждения кучи, все работало бы так, как ожидалось, однако Visual Studio сообщал бы о повреждении кучи при завершении работы приложения.
Изменение в Struct3, которое решило проблему:
typedef struct Struct3 : public StructBase
{
} Struct3;
Теперь я предполагаю, что я смешивал структуру POD с классом, замаскированным под структуру, но это похоже на длинный выстрел,Что я здесь не так делаю?
EDIT : причина, по которой я добавил конструкторы, была в том, чтобы я мог добавить к Vector <> Struct3, просто передав ему Vector3 <>, который будет создаватьStruct3 и вставьте его в массив.Итак, допустим, вектор: vector<Struct3>
, затем я добавил к нему Struct3 следующим образом: myVec.push_back(Vector2(i, j));
(вектор <> находится в классе шаблона, где типом может быть любая из этих структур).
ПРИМЕЧАНИЕ : я поменял имена, чтобы не наступать на NDA.Поэтому, пожалуйста, игнорируйте любые проблемы со стилем, если это не влияет на код.Поскольку код довольно прост, я вставил все, что, я уверен, многие из вас уже знают, невозможно все время с производственным кодом.