2014-10-14 9 views

Odpowiedz

9

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:

  1. Vec jest przydzielona. Początkowo nie jest przydzielana pamięć dla elementów (gdy Vec jest pusta).
  2. Gdy elementy są dodawane do wektora, pamięć dla elementów jest przydzielana ze sterty. Vec przechowuje wskaźnik do tego magazynu.
  3. Po upuszczeniu wektoryzacji pamięć elementów zostanie najpierw zwolniona, a następnie zostanie zwolniony sam Vec.

na kawałek:

  1. Część pamięci jest przydzielona do tablicy lub wektor elementów statycznie lub dynamicznie.
  2. 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.
  3. Po upuszczeniu plastra pamięć elementów nie zostaje zwolniona, ponieważ plasterek nie jest jego właścicielem; tylko plasterek zostanie upuszczony.
  4. 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

+0

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

+0

@ 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ć. –

+0

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

Powiązane problemy