vector und delete
-
hallo!
ich habe einen vector:std::vector<Button *> buttons;
den fülle ich so:
for (int i = 0; i < 5; i++) buttons.push_back(new Button());
und will ihn so löschen:
for (std::vector<Button *>::iterator it = buttons.begin(); it != buttons.end(); it++); { Button *b = *it; if (b) delete b; }
aber warum schmirt der beim löschen mit access violation ab?
danke im voraus!
-
1. ++it vs it++
2. delete NULL; ist kein Problem und du musst nicht prüfen, ob der Pointer, den du deletest NULL ist, dass ist nur Zeit Verschwendung
3. Bist du dir sicher, dass du nur versuchst die Objekte zu löschen, die du mit new angelegt hast?
-
kingruedi schrieb:
3. Bist du dir sicher, dass du nur versuchst die Objekte zu löschen, die du mit new angelegt hast?
ja, andere objekte sind ja nicht im vektor drinnen. gibts da vielleicht eine andere möglichkeit?
-
schau dir mal im Debugger (oder zu not per Programm Output) an, welche Adressen new zurück liefert und welche du nacher delete übergibst
-
kingruedi schrieb:
schau dir mal im Debugger (oder zu not per Programm Output) an, welche Adressen new zurück liefert und welche du nacher delete übergibst
die addressen stimmen nicht überein!! an was liegt das?
-
1. Juchuu ! Ein Speicherloch!
2. Warum schreibst du nicht
for (std::vector<Button *>::iterator it = buttons.begin(); it != buttons.end(); ++it); { delete *it; }
3.Wie wärs denn damit:
while(!buttons.empty()) { delete buttons.pop_back(); }
Achja, keine Ahnung, ob das besser ist
mfg
Glamdring
-
habs so gelöst:
for (int i = 0; i< buttons.size(); i++) delete buttons[i]; std::vector<Button *>().swap(buttons);
-
Und wenn man die Nase voll hat von Speicherlöchern, Zugriffsfehlern und langem Code, kann man auch einen SmartPointer wie boost::shared_ptr (www.boost.org) verwenden...
-
3.Wie wärs denn damit:
C/C++ Code:
while(!buttons.empty())
{
delete buttons.pop_back();
}C/C++ Code:
............Achja, keine Ahnung, ob das besser ist
Guck mal auf die Definition
void pop_back ()