Wątek przeniesiony 2018-07-22 09:33 z C/C++ przez kq.

Jak posługiwać się smart pointers

0

To mój debiut na forum także cześć wszystkim ! ;)

Weźmy na warsztat uniqe pointer.
Dowiedziałem się, że tworzymy unique pointer po to żeby nie pisać delete no i że nazywa się unique bo musi być tylko jeden, jak mamy dwa unique_ptr na fragment pamięci i usuniemy jeden z nich to On zwolni tą pamięć a drugi będzie wskazywał na nic. Na unique pointer można powiedzieć też scope pointer bo usuwa się wraz z wyjściem ze scope'a. Tyle dowiedziałem się z internetów...

Shared ptr ma licznik odwołań i jest usuwany gdy odwołania wynoszą 0 a weak ptr nie ma licznika odwołań ale zachowuje się podobnie do shared, możemy przypisać do weak shared tylko, że nie za bardzo wiem jak go zastosować.

Poprawcie mnie proszę jeżeli się mylę, wyszukałem te informacje w internecie.
Teraz rodzi się pytanie, jak je ćwiczyć i gdzie je wykorzystywać.
Po co w ogóle powstała dynamiczna alokacja pamięci ? Chodzi o wydajność ? Wiem, że to są błahe pytania ale chcę zrozumieć podstawy.

1

Jak Zadajesz pytanie: "Po co w ogóle powstała dynamizna alokacja pamięci", to Musisz sobie przerobić jakąś książkę albo tutorial do podstaw CS, bo ciężko nam tu będzie napisać elaborat:).
A tutaj seria fajnych tutoriali o smart pointers: https://thispointer.com/c11-tutorial/
"Teraz rodzi się pytanie, jak je ćwiczyć i gdzie je wykorzystywać"
Jak je ćwiczyć, to chyba Wiesz:)
Gdzie wykorzystywać. Jak już Musisz używać wskaźników:, to smart powinne być zawsze preferowane, usuwają sporo problemów nagich wskaźników, głównie zapominaniu o poprawnej instrukcji delete.

0
lion137 napisał(a):

podstaw CS

CS ?

lion137 napisał(a):

A tutaj seria fajnych tutoriali o smart pointers: https://thispointer.com/c11-tutorial/

Dzięki, wgłębię się w temat.

A to co napisałem o nich wydaje się być ok ?

1

żeby wyjaśnić czym się różni shared_ptr od weak_ptr.
Wyobraź sobie, że A ma wskaźnik na B, B na C i C na B i wszystkie są shared_ptr.
Teraz wyobraź sobie, że A kończy czas życia.
B i C nieosiągalne, bo nic innego na nie nie wskazuje, ale nie zostaną zniszczone bo wskazują na siebie na wzajem i licznik referencji nie spadnie do zera.
Pojawia się cykl silnych referencji!
W takich wypadkach w Java/C# wkracza Garbage Collecor, którego nie ma w C++.
Żeby rozwiązać ten problem bez GC trzeba mieć wskaźnik, który zdaje sobie sprawę z licznika referencji, ale go nie powiększa.
Od tego jest właśnie jest weak_ptr, w tym wypadku C powinno mieć wskaźnik weak do B.
Na czas kiedy trzeba użyc tego wskaźnika trzeba go tymczasowo skonwertować do shared_ptr.

Polecam filmik Herb-a Sutter-a z cppCon ze szczegółowym wyjaśnieniem.

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