2017-02-09 15 views
7

Ok, może się to wydawać śmieszne, ale ja tak często zobaczyć kod gdzie dynamicznie przydzielane pamięci usunięte za pomocą odniesienia wygląda tak:Dlaczego nikt nigdy nie pisze "delete & someObj"?

Obj* ptr = &someObj; 
delete ptr; 

zamiast tego, co wydaje się logiczne alternatywa:

delete &someObj; 

Is istnieje jakiś szczególny powód bezpieczeństwa, czy jest to po prostu kwestia stylu?

+0

Na szczęście nie trzeba już używać 'new' /' delete' dzięki inteligentnym wskaźnikom. –

+2

Ponieważ byłoby to całkowicie i całkowicie nieprawidłowe 99,99% czasu, chyba że * wiedzieli *, że obiekt został przydzielony dynamicznie, co '&' z pewnością nie mówi. – EJP

+1

czy masz przykład online, w którym to widziałeś? – Default

Odpowiedz

3

Nie ma dodatkowego bezpieczeństwa. To był styl osoby, która napisała cytowany kod.

PS. Jest (lub powinno być) niezwykle rzadkie usuwanie dynamicznie przydzielanej pamięci przez odniesienie. Bardzo popularną konwencją jest przechowywanie adresów obiektów dynamicznych w wskaźnikach. Obecnie rzadko należy ręcznie usuwać pamięć, ponieważ zadanie jest tradycyjnie delegowane do inteligentnych wskaźników.

+0

Zazwyczaj staram się używać inteligentnych wskaźników, ale silnik, którego używam, został napisany dla naszych projektów uni, w których stary i nowy kod jest trochę zmiksowany. W każdym razie, dziękuję za odpowiedź! :) – Geoff

2

OK, jeśli dynamicznie przydzielisz pamięć, otrzymasz wskaźnik, a nie samą wartość.

int* a = new int; 

Następnie musisz zadzwoń usunąć i przekazać wskaźnik:

delete a; 

Jeśli spróbujesz przypisać do zmiennej jak tego int b = *a; następnie b jest nie dynamicznie przydzielane. Nie można więc pisać delete &b;, ponieważ b jest przydzielany na stosie i będzie automatycznie czyszczony, gdy zniknie z zakresu. Jeśli przypiszesz go do odnośnika, takiego jak int& c = *a;, możesz napisać delete &c;, ale jest to zły styl podatny na błędy, ponieważ nie masz żadnej gwarancji, że pamięć przywoływana przez c jest przydzielana dynamicznie.

+4

Chociaż uważam, że jest to błąd podatny na błędy, to tak naprawdę nie jest tak, ponieważ "nie masz żadnej gwarancji, że pamięć przywoływana przez c jest przydzielana dynamicznie." jak można powiedzieć dokładnie to samo, jeśli był to tylko wskaźnik. – George

-1

Operator "delete" dealokuje blok pamięci, składnia jest:

  1. delete cast-expression
  2. delete[] cast-expression

Według C++ zastrzeżeniem, argument lanego wyrażenie musi być wskaźnik do bloku pamięci poprzednio przydzielonego dla obiektu. Tak więc delete ptr nie jest czymś w stylu, ani nie ma nic wspólnego z bezpieczeństwem.

+1

Całkowicie w porządku wywołanie delete na wskaźniku do odwołania do dynamicznie przydzielanej pamięci.Zakładając, że kod operacji wygląda jak: Obj * oPtr = new Obj; Obj i someObj = * oPtr; Obj * ptr = i someObj; delete ptr; 'co jest domniemane,' delete ptr; 'jest legalne i poprawne. – George

Powiązane problemy