昨天我问this question这导致今天的问题(间接)。我使用以下代码获得了堆损坏:
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添加到数组(Vector<>)时,调试器都会破坏信令堆损坏。如果我关闭了堆损坏检测,一切都会按预期工作,但是Visual Studio会在关闭应用程序时报告堆损坏。
修复问题的Struct3的更改:
typedef struct Struct3 : public StructBase
{
} Struct3;
现在我的猜测是我将POD结构与伪装成结构的类混合在一起,但这似乎是一个很长的镜头。我在这里做错了什么?
编辑:我添加构造函数的原因是我可以添加到Vector&lt;&gt;通过简单地将Vector3传递给Struct3&lt;&gt;这将构造Struct3并将其推入数组。所以我们假设向量是:vector<Struct3>
然后我像这样添加了Struct3:myVec.push_back(Vector2(i, j));
(向量&lt;&gt;在模板类中,其中类型可以是任何这些结构)。
注意:我改变了名字以避免踩到任何NDA。所以请忽略任何样式问题,除非它实际影响代码。由于代码相当简单,我粘贴了整个事情,我相信很多人已经知道,生产代码不可能一直存在。