erase() benötigt delete?
-
Hi...
ich habe folgenden Code und frage mich ob ich meine Vectorelemente die ich mit new anfordere nur mit erase wieder freigebe, oder zusätzlich ein delete brauche?typedef vector<User>::iterator IteratorType; class Chat_impl : virtual public POA_Chat { private: vector<User> userlist; public: Chat_impl(){ }; CORBA::Short Chat_impl::idl_login( const char* nick, const char* ip ){ CORBA::Short success=0; User *u = new User((string)nick, (string)ip); string str; IteratorType it; bool v=true; for(it = userlist.begin(); it != userlist.end(); it++){ cout << it->get_ip() << it->get_name() << endl; (it->get_ip() == ip)? v=false : v=true; } if(v == true){ userlist.push_back(*u); str ="User " + (string)nick + " erfolgreich eingeloggt."; success = 1; } else { str ="User " + (string)nick + " bereits eingeloggt."; } return success; }; CORBA::Short Chat_impl::idl_disconnect( const char* ip ) { CORBA::Short success=0; IteratorType it; string str; cout << "Useranzahl: " << userlist.size() << endl; for (it = userlist.begin(); it != userlist.end(); it++){ if((string)it->get_ip() == ip){ str = "Loesche " + it->get_name() +" !"; // DELETE ??? userlist.erase(it); success = 1; break; } } return success; }; ... ...Falls ich ein zusätzliches delete brauchen würde, verstehe ich nicht so recht wie dieses mit eingebunden wird...

Danke für jeden Tip!
-
Warum machst du das überhaupt mit new und nicht mit einem Objekt das auf dem Stack angelegt wird. Und wenn du dies machst:
userlist.push_back(*u);speicherst du eine Kopie, also kannst du eigentlich direkt hinter diesem push_back auch das delete machen. Weil später kommst du über den vector nicht mehr an den Speicher.
Das Thema hatten wir aber gerade erst hier:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-167502.htmlMach doch einfach statt
User *u = new User((string)nick, (string)ip);dies:
User u((string)nick, (string)ip);Und dann packst du einfach nur u in den Container und kannst dir das dereferenzieren und das delete sparen.
Greetz
-
Vielen Dank für deine Hilfe!
Jetzt habe ich es Verstanden
-
(it->get_ip() == ip)? v=false : v=true;Witzig!

-
? Was is'n daran witzig ?
-
Vermutlich weil du einen Ausdruck der true oder false zurück gibt auf true oder false überprüfst um dann true oder false zu speichern... mit anderen Worten du kannst das Ergebnis des Ausdruckes auch direkt in der Variable speichern...
v = !(it->get_ip() == ip);
-
es sieht zumindest gewöhnungsbedürftig aus. Normalerweise nimmt man den ?:, um eine Zuweisung aus einem if-else "auszuklammern", nicht als Ersatz für if-else:
v=(it->get_ip()==ip)?false:true; //oder kürzer v=(it->get_ip()!=ip);
-
ah... Ok.
Das kam automatisch, da ich es auch mit nicht boolschen Zuweisungen so mache...(it->get_ip() == ip)? wert=123 : wert=0;Aber danke für den Hinweis...
-
Auch das sieht witzig aus. Der Operator "?:" ist ein Operator, welcher einen Wert liefert. Also bei nicht boolschen Zuweisungen entweder so:
if (it->get_ip() == ip) wert = 123; else wert = 0;oder so:
wert = (it->get_ip() == ip ? 123 : 0);Tntnet