Повреждение кучи из структуры наследования - PullRequest
0 голосов
/ 29 июня 2011

Я задал этот вопрос вчера, что приводит к сегодняшнему вопросу (косвенно).Я получал повреждение кучи с помощью следующего кода:

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.Поэтому, пожалуйста, игнорируйте любые проблемы со стилем, если это не влияет на код.Поскольку код довольно прост, я вставил все, что, я уверен, многие из вас уже знают, невозможно все время с производственным кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...