Wektory tworzą kopie na push_back. Ponieważ wskaźnik jest "tylko inną zmienną" (ale taką, która zdarza się wskazywać na pamięć), kiedy push_back jest wskaźnikiem całkowitym, który został wcześniej przydzielony, kopiujesz wartość wskaźnika do wektora, co powoduje potencjalny wskaźnik zwisający, ponieważ być dwoma wskazówkami wskazującymi na to samo miejsce w pamięci.
W pierwszym przykładzie trzeba ręcznie usunąć pamięć. Jedną ze strategii Użyłem w przeszłości za wtrącanie z klas wykres jest mieć coś takiego (ogromne ilości rzeczy redacted powodu bycia w pracy i wpisując szybko):
class graph //quick-format
{
vector<node*> nodes;
add_node(node n)
{
node *temp = new node;
*temp = n;
nodes.push_back(temp)
}
~graph()
{
for(int i = 0; i < nodes.size(); i++)
delete nodes[i];
}
};
Jako zastrzeżenie, kopia semantyka wykresu będą musiały zostać zbadane. W obecnej wersji spowoduje to usunięcie poprzednio wolnej pamięci. Zaletą jest to, że zawsze możesz mieć ten sam zestaw węzłów. Usterka Emptor, podobnie jak każde użycie pamięci bezpośredniej.
Jednakże, jeśli po prostu wciśniesz zmienną bez wskaźnika, nie ma możliwości wycieku pamięci z twojego końca. Być może wektor wycieknie, ale ... to jest praktycznie niemożliwe w tym momencie dojrzałości narzędzi.
kiedy mówisz, że poradzi sobie z samą pamięcią, masz na myśli, po wywołaniu vector.clear()? – TheFuzz
Pamięć zostanie odzyskana po zniszczeniu wektora. 'clear()' faktycznie nie zwalnia żadnej pamięci; wektor zachowa pojemność na wypadek, gdyby musiał ponownie się rozwijać później. –
Więc co powstrzymuje mnie przed niestosowaniem wskaźników i po prostu tworząc zmienne stosu zmiennych, a następnie wciskając je do wektora, kiedy muszę? z jakiegoś powodu wskaźniki straciły sens. – TheFuzz