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_ptr
lub 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.