Ich habe ein bisschen verwirrt in letzter Zeit über den Speicher (de) Zuweisung von std::vectors
Fragen zu memorybehavior von Vektoren
Nehmen wir an, ich Normalvektor integer bekam: std::vector<int> intv;
Wenn ich einige int
‚s push_back
wächst es von Zeit. Und wenn ich den Gültigkeitsbereich (d. H.) Der Funktion verlasse, wird die Zuordnung aufgehoben, ohne dass zusätzliche Aufrufe erforderlich sind.
Großartig. Lässt ein weiteres Beispiel haben:
struct foo_t{
std::string bar:
unsigned int derp;
}
void hurr(){
std::vector<foo_t> foov;
foo_t foo;
foo.bar = "Sup?";
foo.derp = 1337;
foov.push_back(foo);
}
Okay. Wenn ich hurr()
rufe, wird der Vektor erstellt, eine foo_t
Instanz wird erstellt, die Instanz wird gefüllt und in den Vektor geschoben. Also, wenn ich die Funktion verlasse, wird der Vektor freigegeben und der Inhalt (hier ein foo_t
) wird ebenfalls freigegeben?
Nächstes Beispiel:
struct foo_t{
std::string bar:
unsigned int derp;
}
std::vector<foo_t> hurr(){
std::vector<foo_t> foov;
foo_t foo;
foo.bar = "Sup?";
foo.derp = 1337;
foov.push_back(foo);
return foov;
}
In meinem Verständnis der Vektor und dessen Inhalt in dem Stapel leben, die (eventuell) wird von Zeit überschrieben und der Vektor ich zurückgekehrt und sein Inhalt wird nutzlos sein. Oder gibt es tatsächlich eine Kopie des Vektors mit einer Kopie seines Inhalts zurück (erfordert einen Kopierkonstruktor für den Inhaltsdatentyp, wenn es kein POD ist)?
Und etwas offensichtlich:
struct foo_t{
std::string bar:
unsigned int derp;
}
std::vector<foo_t*> hurr(){
std::vector<foo_t*> foov;
foo_t foo = new foo_t;
foo->bar = "Sup?";
foo->derp = 1337;
foov.push_back(foo);
return foov;
}
Jetzt muss ich manuell über den Vektor laufen, dessen Inhalt löschen und dann kann ich sicher den Vektor fallen out of scope lassen, nicht wahr?
_ "Jetzt muss ich manuell über den Vektor iterieren, lösche seinen Inhalt und dann kann ich den Vektor sicher außerhalb des Bereichs fallen lassen, richtig?" _ Ja. –
"Jetzt muss ich manuell über den Vektor iterieren, seinen Inhalt löschen und dann kann ich den Vektor sicher außerhalb des Bereichs fallen lassen, richtig?" Das würde die Zeiger in dem zurückgegebenen Vektor ungültig machen. Wenn Sie das nicht wollen und es wahrscheinlich nicht ist, sollten Sie es nicht tun. – molbdnilo
@molbdnilo Hängt davon ab, wann _Now_ passieren soll. –