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 ()
    

Anmelden zum Antworten