vector, string und c_str() Probleme
-
hi,
ich habe folgenden Code geschrieben(eine Funktion eines Dialog, aber da liegt das Problem sicher nicht, deswegen habs ich es auch hier rein gepostet):void GebDialog::OnDblclkList2() { int id=m_geblist2.GetCurSel(); if((m_eisen>=m_geb1[id]->GetBauKosten().Get_Eisen())&&(m_wasser>=m_geb1[id]->GetBauKosten().Get_Wasser())&&(m_geld>=m_geb1[id]->GetBauKosten().Get_Geld())) { UpdateData(TRUE); if(id<=10) m_geb.push_back(m_geb1[id]); m_res.Set_Eisen(m_eisen-=m_geb1[id]->GetBauKosten().Get_Eisen()); m_res.Set_Wasser(m_wasser-=m_geb1[id]->GetBauKosten().Get_Wasser()); m_res.Set_Geld(m_geld-=m_geb1[id]->GetBauKosten().Get_Geld()); //Hier kommt der Speicherfehler:m_geb[id]->GetName().c_str(); m_geblist.AddString(m_geb[id]->GetName().c_str()); UpdateData(FALSE); }else{ MessageBox("Nicht genug Ressourcen!",MB_OK);} }
Das Programm stürtzt ab bei c_str(), wenn id den Wert ungelich 0 hat. m_geb1 ist ein vector mit Pointern von Klasse Gebaeude:
class Gebaeude { string m_name; int m_ID; int m_bauzeit; int m_akt_bauzeit; BOOL m_aktiv; Res BauKosten; Res LaufendeKosten; public: Gebaeude(string name="NULL",int bauzeit=0 ,int ID=0):BauKosten(100,100,100),m_bauzeit(bauzeit),m_akt_bauzeit(0),m_aktiv(false),m_ID(ID){ m_name=name; } virtual void bauen(); string GetName(){return m_name;} BOOL GetAktiv(){return m_aktiv;} int GetID(){return m_ID;} double GetBauzeit(){return m_bauzeit;} double GetAktBauzeit(){return m_akt_bauzeit;} Res GetBauKosten(){return BauKosten;} Res GetLKosten(){return LaufendeKosten;} };
Hier belege ich (Testhalber) die ersten drei mit unterschiedliche Werten:
Gebs.push_back(new Gebaeude("nochzubauen")); Gebs.push_back(new Gebaeude("nochzubauen1")); Gebs.push_back(new Gebaeude("nochzubauen2"));
(m_geb1 bekommt die werte von Gebs)
Komischerweise kann der Debugger mir aber nicht die Adresse von m_geb[id] anzeigen, Also weiß ich auch nicht welchen wert der string hat.
Was auch merkwürdig ist, ist das bei diesem Aufruf kein Fehler kommt(size hat den wert 2):CDialog::OnInitDialog(); for(int i=0;i<m_geb.size();i++) { if(!m_geb[i]->GetAktiv()) m_geblist.AddString(m_geb[i]->GetName().c_str()); } for( i=0;i<m_geb1.size();i++) { m_geblist2.AddString(m_geb1[i]->GetName().c_str()); } return TRUE;
Kann mir wer helfen?
-
hoi
Archon schrieb:
//Hier kommt der Speicherfehler:m_geb[id]->GetName().c_str(); m_geblist.AddString(m_geb[id]->GetName().c_str()); (1) UpdateData(FALSE); }else{ MessageBox("Nicht genug Ressourcen!",MB_OK);} }
Das Programm stürtzt ab bei c_str(), wenn id den Wert ungelich 0 hat. m_geb1 ist ein vector mit Pointern von Klasse Gebaeude:
bei (1) steht aber m_geb[id] und nicht m_geb1[id]. koennte das der fehler sein ?
Meep Meep
-
Thx, es hätte das hingehört:
m_geblist.AddString(m_geb[m_geb.size()-1]->GetName().c_str());
Danke!