Dynamiczna alokacja pamięci

0

Witam, zastanawiam się jak tworzyć obiekty i jak się później do nich odwoływać przy użyciu inteligentnych wskaźników, chodzi mi to że dany obiekt jest tworzony w momencie gdy jest potrzebny a jeden z jego parametrów jest wskaźnikiem do wcześniej dodanego elementu, liczę na jakieś wskazówki

1

Jeden z jego elementów jest wskaźnikiem do wcześniej dodanego elementu? Jak w takim razie tworzysz pierwszy element? Ogółem do tworzenia obietków typu unique_ptr<T>/shared_ptr<T> używa się odpowiednio std::make_unique i std::make_shared.

0

No tak, pierwszy element tworze na początku programu a wskaźnik na niego ustawiam na nullptr. Czyli robię to tak:
1.Tworzę obiekt pierwszy (wskażnik na poprzedni ustawiam na nullptr).
2.Tworzę następny obiekt, obieram wskaźnik na niego i zapisuję do poprzedniego.
i tak potrzebną mi ilość razy.

A teraz chcę np. wypisać utworzone elementy to:
1.pobieram wskaźnik do pierwszego elementu z niego odczytuję wskaźnik do następnego i przechodzę do niego,
i powtarzam tę czynność aż dotrę do potrzebnego mi elementu.

Dobrze rozumiem?

3

A nie lepiej użyć kontenera z biblioteki standardowej, np. std::vector i nie martwić się takimi rzeczami? Lista to bardzo rzadko najlepszy kontener.

3

Jak nie masz wyjścia i powinna być lista, to unique_ptr powinien wskazywać na następny węzeł lub na nullptr (na końcu listy). Jak będziesz go konstruował bez argumentów, domyślnie będzie wskazywał na nullptr. nullptr podda się poprawnej destrukcji. Zniszczenie głowy listy z węzłami gdzie next będzie unique_ptr, pociągnie za sobą "domino zniszczeń" we wszystkich węzłach i o to chodzi. Jedyne niebezpieczeństwo to ew. przeciążenie stosu powrotami z tych wywołań.

Do obejrzenia i poczytania:

https://github.com/CppCon/CppCon2016/blob/master/Presentations/Lifetime%20Safety%20By%20Default%20-%20Making%20Code%20Leak-Free%20by%20Construction/Lifetime%20Safety%20By%20Default%20-%20Making%20Code%20Leak-Free%20by%20Construction%20-%20Herb%20Sutter%20-%20CppCon%202016.pdf

1 użytkowników online, w tym zalogowanych: 0, gości: 1