Na szybko:
oraz czy nie ma wycieków pamięci
Proponuje bardzo prosty stress test for 1000000 razy stworz kolejke, cos dodaj, cos usun i patrz czy pamięć zjadana przez program rośnie, czy to w jakimś debugerze czy po prostu podglądając proces. To najprostsze rozwiązania przy takich prostych programach. Są też fajne programy do analizy wycieków np valgrind, którego użycie skraca się do valgrind moj_program i wypisuje Ci czy wszystko jest cacy z pamięcią.
a - zawsze gdy się da korzystaj z gotowych implementacji. Wynajdywanie koła od nowa jest złe z dwóch powodów:
- zajmuje czas
- osoby, które czytają Twój kod muszą dodkowo ogarnąć Twoją implementacje ogólnie znanych i już rozwiązanych problemów
Jedyny plus wynajdywania koła od nowa jest głębsze zrozumienie tego koła. Dlatego warto sobie dla treningu raz zaimplementować a potem korzystać z gotowych rozwiązań.
b - musisz pamiętać, że robiąc delete wskaźnik zwalniasz pamięć na którą ten wskaźnik wskazuje, nic wiecej, sam wskaźnik dalej pokazuje dokładnie w to samo miejsce. Zwolnienie pamięci oznacza, że zrzekasz się tej pamięci i nie należy już ona do programu, czyli jest wolna i może zostać ponownie wykorzystana na np inną zmienną.
first = nullptr;
first = tmp->next; // 3
ustawienie firsta na nullptr jest bez sensu skoro zostanie linijke nizej nadpisany. Posiadanie wskaźnika do pamięci która nie należy do Ciebie nie jest przestępstwem :D. Czasem można nawet odczytać jej wartość albo nawet coś tam zapisać. Spowoduje to niezdefiniowane zachowanie i okazjonalnie memory access violation, segmentation fault i takie tam, więc nie polecam.
Co do implementacji to nie jest zła. Nie podoba mi się jedynie brak destruktora i brak składowej size :D. Po przechodzić za każdym razem po wszystkich elementach?
Definiowanie konstruktora tylko po to żeby ustawić nullptr też nie jest za fajne, skoro od C++11 można zrobić po prostu tak:
struct Node {
int m_id;
Node *next = nullptr;
};
Ostatnia sprawa to ciekawostka - listy to przestarzałość ze względu na to, że nie są cache-friendly i są sensowne tylko w teori. Sytuacje, w których warto wybrać liste ponad tablice dynamiczną czy częściową tablice dynamiczną (std::dequeue) już prawie nie występują. Sam twórca C++ tutaj o tym mówił.