Wpis z mikrobloga

Mały kod: https://pastebin.com/y8tNpFtA

Nie wiem czy tak się da? Tworzę shared pointer, czyszczę listę i zamykam funkcję więc ostatni pointer ginie... czyli i "podmiot liryczny" ginie, ale w którym momencie? Czy coś może pójść nie tak? W programie to nie do końca tak wygląda, ale sytuacja ta sama.

#programowanie #cpp
  • 15
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@s_theCapt: jaki potwór ( ͡° ʖ̯ ͡°) W tym wypadku TaskEnd zabija sam siebie. Jak po steps.clear() odpali się jakiś kod, który będzie uderzał do jakiegokolwiek pola TaskEnd (tutaj chyba tak nie jest, ale mówię o przyszłości, wystarczy, że dodasz jakieś pole np std::string) to będziesz miał UB. Rozwiązanie: kod, w którym nie ma cykli
  • Odpowiedz
to jest typowy przypadek "delete this", póki po steps.clear nie robisz nic z tym obiektem to jest ok. Według mnie nawet nie musiałeś robić tej kopii.
  • Odpowiedz
@Saly: @vytah: Przyjrzycie się, on robi kopie auto ptr, czyli obiekt zniknie dopiero po zwinięciu stosu i to w wypadku kiedy wywoła na referencji do elementu pola steps, a nie kopii tego shared_ptr.

@s_theCapt: Metoda, która niszczy swój obiekt, na którym jest wywoływany to antywzorzec.
  • Odpowiedz
, a więc self ginie dopiero po return?


@s_theCapt: tak, ale po tym usunięciu ptr dalej odpalają się destruktory zmiennych lokalnych będących przed ptr. Czy to jest legalne: szczerze nie wiem, na pewno jest to brzydkie. Przykładowo wystarczy, że ktoś bez dogłebnęgo czytania kodu doda jakiś mutex przy użyciu std::lock_guard na samym początku funkcji.


@lionbest: tak, nie doczytałem
  • Odpowiedz
@lionbest: moim takim eksperymentalnym "wzorcem" jest to, że "wszystko jest krokiem" i cała appka sobie chodzi kolejkując i odpalając te kroki więc sobie zrobiłem czyszczenie też w taki sposób. ( ͡º ͜ʖ͡º) w programie właściwym, exec() jest prywatną funkcją wywoływaną tylko z jednego miejsca, statycznej funkcji exec_next()
  • Odpowiedz
@lionbest: pewnie nie pamiętasz, ale pomogłeś mi na wykopie już kilka razy więc szanuję twój autorytet xD i jeżeli to co napisałem cię nie przekonuje w ogóle, to to zmienię :D
  • Odpowiedz
@lionbest: tak, ale chciałem żeby stepy to były subclassy i mieć te operacje w takim miejscu, z innymi dla każdego stepa zmiennymi i operacjami dodatkowymi, bo inaczej to jedyne co widzę to jakieś niepotrzebne potem rozpoznawanie po tym statusie, potem jeszcze cast do odpowiedniej klasy i subklasy jeszcze tych kontrolerów... strasznie dużo kodu, albo źle to widzę... a chcę to wykorzystać w przynajmniej dwóch programach jakie mam, więc zupełnie inne
  • Odpowiedz
@s_theCapt: Sterowanie elementami klasy Task powinno należeć do jej samej, więc wywoływanie steps.clear() z innej klasy jest złym nawykiem. Teraz zwróciłem uwagę, że pole jest prywatne i nie ma dostępu z Task_end, więc przykład jest błędny. Możliwości sterowania pętlą Stepów w Tasku też nie powinieneś mieć tak znowu dużo.
  • Odpowiedz
@lionbest: tak, przykład jest błędny, w programie mam friend class. No i jasne, ale czy tworzenie dodatkowej funkcji Task::clear_steps i wywoływanie jej tylko po to żeby zachować hierarchię ma sens? Zawsze się przecież np. z jakiegoś gui czy z powodu jakiegoś zdarzenia w silniku robi jakieś operacje, klasy ze sobą rozmawiają. ( ͡° ʖ̯ ͡°)
  • Odpowiedz