Wektor jest właścicielem jego elementów. Oznacza to, że wektor jest odpowiedzialny za przydzielanie i zwalnianie elementów, na które wskazuje. Żywotność elementów wektorowych jest taka sama jak czas życia samego wektora, więc nie ma potrzeby określania czasu życia dla typu Vec
.
Kawałek pożycza elementy wektora lub tablicy, które mogą być przydzielane statycznie lub dynamicznie. Wycinek musi wskazywać czas życia pożyczonych elementów, aby kompilator mógł przeprowadzić niezbędne kontrole bezpieczeństwa.
Innym sposobem wyrażenia tego jest porównywanie sekwencji zdarzeń między dwiema opcjami.
Dla wektora:
Vec
jest przydzielona. Początkowo nie jest przydzielana pamięć dla elementów (gdy Vec
jest pusta).
- Gdy elementy są dodawane do wektora, pamięć dla elementów jest przydzielana ze sterty.
Vec
przechowuje wskaźnik do tego magazynu.
- Po upuszczeniu wektoryzacji pamięć elementów zostanie najpierw zwolniona, a następnie zostanie zwolniony sam
Vec
.
na kawałek:
- Część pamięci jest przydzielona do tablicy lub wektor elementów statycznie lub dynamicznie.
- Plasterek jest przydzielany i inicjalizowany w celu odniesienia się do niektórych lub wszystkich elementów tego magazynu. Plasterek przechowuje wskaźnik do pierwszego elementu.
- Po upuszczeniu plastra pamięć elementów nie zostaje zwolniona, ponieważ plasterek nie jest jego właścicielem; tylko plasterek zostanie upuszczony.
- Jeśli pamięć została przydzielona dynamicznie, zostanie ostatecznie zwolniona.
EDIT
Ogólnie rzecz biorąc, przyp życia jest wymagane zapożyczonych wskaźników (&'a X
), w rodzaju, które zawierają zapożyczonych wskazówek (X<'a>
, gdzie X
JeSt struct
lub enum
że posiada człon, który jest pożyczony wskaźnik) oraz na obiektach/ograniczeniach cech (X+'a
, gdzie X
jest trait
), gdy typy te są używane jako elementy składowe struct
lub enum
.
Na let
wiązaniami i na prawej stronie operatora as
, zwykle napisać pożyczonych typy wskaźnika bez adnotacji dożywotnią (czyli po prostu &X
), ponieważ kompilator wywodzi się z życia w tej sprawie.
Co trzeba pamiętać jest to, że adnotacje lifetime są konieczne, gdy ma do czynienia z zapożyczonych wskaźników, bezpośrednio lub pośrednio.
Jeśli chcesz dowiedzieć się więcej na temat własności, pożyczek i wcieleń, proponuję przeczytać the Rust Guide's section on pointers jak również Rust References and Lifetimes Guide
Jak rozumiem '' Drop' Vec' realizuje destructor i nie wymaga za to całe życie . Więc jeśli również zaimplementuję dla dowolnej struktury 'Drop' destructor, to również nie będzie wymagać trwałości jak wektor? – tbicr
@ tbicr: masz go w tył; 'Vec' implementuje' Upuść' * ponieważ * posiada swoje elementy * i * musi używać określonych operacji, aby zwolnić powiązaną pamięć. Własność jest zatem * przyczyną *, a nie * konsekwencją *. Ponadto, możesz mieć prawo własności bez 'Drop':' struct M {a: A} '=>' M' posiada 'A' ale nie musi robić nic specjalnego aby go zwolnić. –
Ok, ale dla 'struct M {a: A}' 'a: A' nie jest odniesieniem. Chcę tylko wyjaśnić, czy implementacja destruktora zastępuje definicję lifetime, kiedy używane są referencje? – tbicr