C ++ dotyczy własności pamięci - czyli semantyki własności .
Za zwolnienie tej pamięci odpowiada właściciel fragmentu dynamicznie przydzielanej pamięci. Tak więc naprawdę pojawia się pytanie, kto jest właścicielem pamięci.
W C ++ własność jest udokumentowana przez typ, w którym surowy wskaźnik jest zawinięty, więc w dobrym programie (IMO) C ++ bardzo rzadko ( rzadko , nie nigdy ) można zobaczyć surowe wskaźniki przekazywane dookoła (ponieważ surowe wskaźniki nie mają wywiedzionej własności, więc nie mów, kto jest właścicielem pamięci, a zatem bez uważnego przeczytania dokumentacji nie możesz powiedzieć, kto jest odpowiedzialny za własność).
I odwrotnie, rzadko można zobaczyć surowe wskaźniki przechowywane w klasie, każdy surowy wskaźnik jest przechowywany we własnym inteligentnym opakowaniu wskaźnika. ( Uwaga: jeśli nie jesteś właścicielem obiektu, nie powinieneś go przechowywać, ponieważ nie możesz wiedzieć, kiedy wyjdzie on poza zakres i zostanie zniszczony).
Więc pytanie:
- Z jakim rodzajem semantyki własności ludzie się spotykają?
- Jakie standardowe klasy są używane do implementacji tej semantyki?
- W jakich sytuacjach uważasz je za przydatne?
Pozwala zachować 1 typ własności semantycznej na odpowiedź, aby można było indywidualnie głosować w górę iw dół.
Podsumowanie:
Koncepcyjnie inteligentne wskaźniki są proste, a naiwna implementacja jest łatwa. Widziałem wiele prób implementacji, ale niezmiennie są one zepsute w sposób, który nie jest oczywisty dla zwykłego użycia i przykładów. Dlatego radzę zawsze używać dobrze przetestowanych inteligentnych wskaźników z biblioteki zamiast tworzyć własne. std::auto_ptrlub jeden z inteligentnych wskaźników Boost wydaje się spełniać wszystkie moje potrzeby.
std::auto_ptr<T>:
Właścicielem obiektu jest jedna osoba. Przeniesienie własności jest dozwolone.
Użycie: Pozwala to zdefiniować interfejsy, które pokazują wyraźne przeniesienie własności.
boost::scoped_ptr<T>
Właścicielem obiektu jest jedna osoba. Przeniesienie własności NIE jest dozwolone.
Użycie: używane do pokazania wyraźnej własności. Obiekt zostanie zniszczony przez destruktor lub po jawnym zresetowaniu.
boost::shared_ptr<T>( std::tr1::shared_ptr<T>)
Wielokrotna własność. To jest prosty wskaźnik liczony referencyjnie. Gdy liczba referencji osiągnie zero, obiekt zostanie zniszczony.
Użycie: Gdy obiekt może mieć wiele kwiatów, których okres istnienia nie może być określony w czasie kompilacji.
boost::weak_ptr<T>:
Używane shared_ptr<T>w sytuacjach, gdy może wystąpić cykl wskaźników.
Użycie: Służy do zatrzymywania cykli przed zachowywaniem obiektów, gdy tylko cykl utrzymuje wspólne odniesienie.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good (IMO) Czy można to przeformułować? W ogóle tego nie rozumiem.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good C++ program it is very rare to see RAW pointers passed around. Wskaźniki RAW nie mają semantyki własności. Jeśli nie znasz właściciela, nie wiesz, kto jest odpowiedzialny za usunięcie obiektu.Istnieje kilka standardowych klas, które są używane do zawijania wskaźników (std :: shared_ptr, std :: unique_ptr itp.), Które definiują własność, a tym samym zdefiniuj, kto jest odpowiedzialny za usunięcie wskaźnika.