2015-08-28 5 views
1

Привет им сделать менеджерстанд :: вектор push_back врезаться

Color класс внутри Color.h -Включены перед тем Manager.h

`Manager.h

class ColorEntry 
{ 
private: 
    const char* m_pszName; 
    Color m_colColor; 

public: 
    inline const char* GetName(void) const { return m_pszName; } 
    inline void SetName(const char* pszName) { m_pszName = pszName; } 
    inline Color GetColor(void) { return m_colColor; } 
    inline void SetColor(Color colNew) { m_colColor = colNew; } 
}; 

class CColorManager 
{ 
private: 
    std::vector<ColorEntry*> m_vecColors; 
public: 
    void Initialize(void); 
    --etc 
} 

Manager.cpp

void CColorManager::Initialize(void) 
{ 
    AddColor("GUI_Outline", Color(0, 128, 255)); 
} 

void CColorManager::AddColor(char* pszName, Color col) 
{ 
    ColorEntry NewCvar; 
    NewCvar.SetName(pszName); 
    NewCvar.SetColor(col); 
    m_vecColors.push_back(&NewCvar); -- crash here 
}` 

Помогите, я пробовал много способов, никто не работает, у меня есть другой способ, который делает это, но без цвета, и он работает s, так это цвет, который его испортил?

цвет класс с 4 байта

+1

Пожалуйста, сделайте небольшой, но * компилируемый * пример, чтобы увидеть проблему. – deviantfan

+0

Btw., 'Цветной класс внутри Color.h, включенный до того, как Manager.h' звучит как порядок ваших включений, важен ... вы можете включить Color.h (дополнительно) в Manager.h тоже, чтобы заказ не делал разница больше. – deviantfan

+1

Просто не делайте контейнеры с обнаженными указателями. Все преимущества контейнеров теряются, когда они работают с объектами, которые не соответствуют семантике нормального значения. –

ответ

1

Эта линия

m_vecColors.push_back (& NewCvar); - crash here

добавляет указатель локальной переменной, который больше недействителен после завершения AddColor. Вам нужно добавить сюда указатель, возвращаемые от вызова new как:

ColorEntry* pNewCvar = new ColorEntry(); 
// ... 
m_vecColors.push_back(pNewCvar); 

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

+0

Я вижу, хотел бы сделать это, а затем безопасно удалить его, используя delete [] work? –

+0

@jacobharris, используя 'delete',' delete [] 'для массивов. Я бы предложил использовать: 'std :: vector > m_vecColors;'. – marcinj

+0

Другое дело, что 'AddColor (char * pszName, Color col)' должен быть 'AddColor (const char * pszName, Col col)' – marcinj

Смежные вопросы