2014-09-01 14 views

Odpowiedz

58

Nie, kod powoduje wyciek pamięci. release służy do uwolnienia własności zarządzanego obiektu bez usuwając go:

auto v = make_unique<int>(12); // manages the object 
int * raw = v.release();  // pointer to no-longer-managed object 
delete raw;      // needs manual deletion 

Nie rób tego, chyba że masz dobry powód, aby żonglować pamięć surowy bez siatki bezpieczeństwa.

Aby usunąć obiekt, użyj reset.

auto v = make_unique<int>(12); // manages the object 
v.reset();      // delete the object, leaving v empty 
+2

Jako całkowicie nietypowy temat, widziałem ludzi piszących "int * raw' i' int * raw', ale po raz pierwszy widziałem 'int * raw' – CoryKramer

+10

@Cyber: To kwestia gustu. Nie uważam kwalifikatora wskaźnika za "dołączony" do typu lub zmiennej, więc nie dołączam go do żadnej z nich. –

+4

Jeśli jest to smutne, zdecydowali użyć tych nazw funkcji. Coś takiego jak "odłącz" byłoby znacznie mniej mylące niż "release". – minexew

10

release wycieknie nieprzetworzonego wskaźnika, ponieważ nie przypisujesz go do niczego.

Jest ona przeznaczona do stosowania na coś jak

int* x = v.release(); 

co oznacza v nie zarządza żywotność tego wskaźnika, jest delegowanie własności surowego wskaźnik do x. Jeśli po prostu release bez przypisywania do niczego, wyciek surowego wskaźnika.

11

Czy ten kod jest prawidłowy?

Nie! To wycieknie.

release() po prostu pozwól, aby kod wywołujący przejął na własność pamięć przechowywaną przez unique_ptr, dopóki nie zostanie wywołana. Jeśli nie przypiszesz wskaźnika zwróconego przez release(), po prostu wystąpi wyciek.

Jednoznaczne usunięcie dla unique_ptr byłoby . Ale pamiętaj, że są tam unique_ptr, dzięki czemu nie musisz bezpośrednio zarządzać posiadaną pamięcią. Oznacza to, że powinieneś wiedzieć, że unique_ptr bezpiecznie usunie swój bazowy surowy wskaźnik, gdy wykracza poza zakres.

Powinieneś mieć bardzo dobry powód, aby ręcznie zarządzać pamięcią na automatycznym obiekcie zarządzania pamięcią.

12

Czy ten kod jest prawidłowy?

nr Zastosowanie std::unique_ptr<>::reset() usunąć wewnętrzny wskaźnik surowego:

auto v = std::make_unique<int>(12); 
v.reset(); // deletes the raw pointer 

Po to zrobisz, std::unique_ptr<>::get() powróci nullptr (chyba, że ​​pod warunkiem, niebędącą nullptr parametr do std::unique_ptr<>::reset()).

1

może być nieco trudne dla dowolnych typów:

unique_ptr<Foo> v = get_me_some_foo(); // manages the object 
    Foo * raw = v.release();  // pointer to no-longer-managed object 
    delete raw; 

jest prawie poprawne.

unique_ptr<Foo> v = get_me_some_foo(); // manages the object 
    Foo * ptr = v.release();  // pointer to no-longer-managed object 
    v.get_deleter() (ptr); 

ten byłby poprawny we wszystkich sytuacjach; może istnieć niestandardowy deleter zdefiniowany na typie Foo, ale użycie deletera zwróconego przez obiekt unique_ptr jest dobre we wszystkich przypadkach.