mam nieco zmieszany ostatnio o pamięć (de) alokacji std::vectors
Pytania dotyczące memorybehavior wektorów
Załóżmy mam normalny wektor liczb całkowitych: std::vector<int> intv;
Kiedy push_back
kilka int
„s rośnie przez czas. A kiedy opuszczę zakres (tj.) Funkcji, zostanie ona zwolniona bez potrzeby dodatkowych wywołań.
Świetnie. Załóżmy inny przykład:
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);
}
OK. Kiedy zadzwonię pod numer hurr()
, wektor zostanie utworzony, instancja foo_t
zostanie utworzona, instancja zostanie wypełniona i wypchnięta do wektora. Więc kiedy opuszczę tę funkcję, wektor zostaje zwolniony, a zawartość (tutaj jedna foo_t
) zostaje również zwolniona.
Następny przykład:
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;
}
W moim rozumieniu, wektor i jego zawartość żyć w stosie, która może (ewentualnie) nadpisane przez czas i wektor wróciłem i jego zawartość będzie bezużyteczny. Czy rzeczywiście zwraca kopię wektora z kopią jego zawartości (wymaga Konstruktora kopii dla typu danych zawartości, jeśli nie jest to POD)?
I coś oczywistego:
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;
}
Teraz muszę ręcznie iteracyjne nad wektorem, usuń jego zawartość, a następnie można bezpiecznie pozwolić wektor wypaść z zakresu, prawda?
_ "Teraz muszę ręcznie wykonać iteracje po wektorze, usunąć jego zawartość, a następnie mogę bezpiecznie pozwolić, by wektor wypadł z zakresu, prawda?" _ Tak. –
"Teraz muszę ręcznie wykonać iterację wektora, usunąć jego zawartość, a następnie mogę bezpiecznie pozwolić, by wektor wypadł z zakresu, prawda?" To unieważniłoby wskaźniki w zwróconym wektorze. Chyba że tego chcesz i prawdopodobnie tak nie jest, nie powinieneś. – molbdnilo
@molbdnilo Zależy, kiedy _Now_ ma się wydarzyć. –