Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » vector unbekannt???

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.09.2008, 09:30 Uhr
dafduf



brauch nochmal bitte ganz dringend eure hilfe...

folgender quellcode (ist nur ein auszug und verkürzt)


C++:
#include <iostream>
#include <vector>

std::vector<Component *> build(std::vector<Component *> components);
void destroy(std::vector<Component *> components);

int main(void)
{
    std::vector<Component *> components;
    
    build(components);
    std::cout<<"Test 2    "<<components.size()<<std::endl;
    destroy(components);
    return 0;
};

std::vector<Component *> build(std::vector<Component *> components)
{
    components.push_back(new Unit());
    std::cout<<"Test 1:    "<<components.size()<<std::endl;
    return components;
};

void destroy(std::vector<Component *> components)
{
    std::cout<<"Test 3    "<<components.size()<<std::endl;
    for (size_t i=0;i<components.size();i++)
        delete components[i];
};



Bei der Ausgabe "Test 1" wird die richtige Größe des Vektors angezeigt, "0".
Aber sobald ich wieder in der main bin, is der Vektor mit einmal futsch und hat keine Komponente mehr und demzufolge in den Ausgaben "Test 2" und "Test 3" wird "0" angezeigt.
Mir ist nicht ganz klar weshalb. kanns sein, dass der Vektor beim Verlassen der "build"-Funktion wieder zerstört wird? Aber ich übergebe den Vektor doch! Wie schaff ich es, dass ich diesen Vektor nun im gesamten Programm zur Verfügung habe, und er erst durch meine "destroy"-Funktion verschwindet?

vielen dank für eure hilfe...
grüße, dafduf.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.09.2008, 10:44 Uhr
ao

(Operator)



Zitat von dafduf:


C++:
std::vector<Component *> build(std::vector<Component *> components)
{
    components.push_back(new Unit());
    std::cout<<"Test 1:    "<<components.size()<<std::endl;
    return components;
};



Mir ist nicht ganz klar weshalb. kanns sein, dass der Vektor beim Verlassen der "build"-Funktion wieder zerstört wird? Aber ich übergebe den Vektor doch!

Ja, aber nur by-Value. In build() füllst du eine lokale Instanz, die am Scope-Ende vernichtet wird. Die per return zurückgegebenen Kopie davon holst du nicht ab (vgl. build()-Aufruf in main), die verfällt also auch.

Mit By-Reference-Übergabe wär das nicht passiert:

C++:
std::vector<Component *> build(std::vector<Component *> & components)
{
    components.push_back(new Unit());
    std::cout<<"Test 1:    "<<components.size()<<std::endl;
    return components;
};


Dann ist die Rückgabe noch nicht mal nötig, und build () kann void sein.

Dieser Post wurde am 18.09.2008 um 10:45 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.09.2008, 11:03 Uhr
dafduf



supiii, es klappt, hab ich mal wieder nicht mitgedacht.

zwar funzt das deleten irgendwie nicht, aber egal, dann bleibt halt der komplette inhalt des vektors bis zum schluss bestehen.wollte eigentlich die objekte die ich mit new erstellte manuell wieder deleten.vielleicht kannst mir ja da auch noch nen tipp geben.

vielen dank. jetzt kanns wenigstens weiter gehen. danke nochmal für die schnelle antwort und noch nen schönen donnerstag.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.09.2008, 12:20 Uhr
xXx
Devil


Jo, auch da wieder das Problem, du löscht nur was in deiner Lokalen Kopie steht. Da es aber zeiger sind, sollten die Objekte danach dennoch ungültig sein, aber das ist so relativ unschön

Die Semikolons die du da setzt sind übrigens falsch!


C++:
#include <iostream>
#include <vector>

typedef std::vector<Component*> component_container_t;

component_container_t& build(component_container_t&);
component_container_t& destroy(component_container_t&);

template <typename pointer_type>
void safe_delete(pointer_type& ptr)
{
    delete ptr;
    ptr = NULL;
}

int main()
{
    component_container_t components;

    std::clog << "LOG: " << build(components).size() << std::endl;

    std::clog << "LOG: " << destroy(components).size() << std::endl;
}

component_container_t& build(component_container_t& components)
{
    components.push_back(new Unit());
    std::clog << "LOG: " << components.size() << std::endl;
    return components;
}

component_container_t& destroy(component_container_t& components)
{
    std::clog << "LOG: " << components.size() << std::endl;
    for (component_container_t::iterator it(components.begin()); it != components.end(); ++it) safe_delete(*it);
    return components;
}
SO, dann hast du zwar die selbe size am Ende noch, aber du kannst dann mitn Vergleich auf NULL feststellen ob noch nen gültiger Zeiger vorhanden ist!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.09.2008, 12:32 Uhr
ao

(Operator)


Dann hast du einen Container voller Zombies, das ist doch genauso mistig, oder?

Wenn build() ein components.push_back() macht, dann muss destroy() die Elemente auch wieder rausnehmen, damit es schön symmetrisch ist.

Kann doch nicht angehen, dass du irgendwo im Programm über den Container iterierst und alles, was du in die Finger kriegst, erstmal auf NULL testen musst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.09.2008, 13:11 Uhr
dafduf



danke euch , jetzt funzt alles, habe das wie ao gesagt hat alles einzeln gelöscht, mit pop_back halt.

aber eine frage is noch dazu gekommen.

es funktioniert alles, compiler meckert nicht und programm tut was es tun soll, also wieso sind die semikolons falsch. habs ausprobiert, es geht auch ohne die semikolons, aba anscheinend is es wurscht, ob man die setzt nach funktionen oder nicht. also, dass sie jetzt FALSCH sind, sehe ich im moment nicht, halt zu viel oder unnötig.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.09.2008, 14:32 Uhr
xXx
Devil


Hm, sie sind laut Std. falsch, werden aber vom Compiler einfach mal ignoriert
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.09.2008, 18:26 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Windows compiler ignorieren die vielleicht, aber gibt genug compiler die das als fehler werten
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: