16

W C++, jeśli chcesz, aby dynamicznie przydzielać tablicę, można zrobić coś takiego:Dlaczego kompilator wymaga `delete [] p` zamiast` delete p [] `?

int *p; 
p = new int[i]; // i is some number 

Jednak, aby usunąć tablicę, robisz ...

delete[] p; 

Dlaczego ISN” t to delete p[]? Czy nie byłoby to bardziej symetryczne w stosunku do tego, jak zostało pierwotnie stworzone? Jaki jest powód (jeśli taki istnieje), dlaczego język został zaprojektowany w ten sposób?

+8

Dlaczego przegłosowanie/głosowanie zostanie zakończone? Co mogę zrobić, aby poprawić pytanie? – Michael0x2a

+5

@Deflect: To było moje, Zwykle "dlaczego wybrano ten konstrukt językowy?" pytania nie są po prostu konstruktywne, ponieważ nie ma obiektywnej, rozsądnej odpowiedzi. Jednak w tym przypadku istnieje kilka przyzwoitych powodów, więc być może oceniłem zbyt wcześnie (dość szybko usunąłem moje poparcie). – KillianDS

+1

@KillianDS: Okay, to ma sens. Dzięki za odpowiedź! [i upewniając mnie, że nie jestem całkowicie poza bazą :)] – Michael0x2a

Odpowiedz

29

Jednym z powodów może być rozróżnienie tych przypadków.

int ** p; 
delete[] p 
delete p[1]; 

Gdyby było delete p[] następnie błąd jedna postać miałaby dość nieprzyjemnych consquences.

+13

Jest to szczególnie prawdziwe, ponieważ na początku C++ trzeba było określić liczbę elementów w '[]'. –

+4

@JamesKanze: Wygląda na to, że to jest odpowiedź dla mnie. "delete p [4]" byłoby niejednoznaczne. – GManNickG

+0

@GManNickG Dokładnie. –

2

Ponieważ tablica zanika do wskaźnika podczas przekazywania jako parametr do funkcji (lub operatora). Usunięcie p [] byłoby po prostu równoznaczne z usunięciem p.

[edycja] Możemy myśleć o usunięciu jako o specjalnym szablonie operatora. Operator powinien być w stanie odróżnić p i p [] w celu wybrania właściwej "specjalizacji" (nie tablica lub usunięcie tablicy). Jednak reguły odliczania argumentów szablonu uniemożliwiają ten wybór (z powodu rozpadu macierzy nie możemy rozróżnić pomiędzy p [] i p przy dedukcji argumentu).

Dlatego nie możemy używać operatora o nazwie usunąć dla obu obudów i trzeba wprowadzić innego operatora delete [] z inną nazwą (sufiks [] może być traktowany jako część nazwy operatora) dla przypadku tablicy.

[edycja 2] Uwaga. delete p [] nie jest prawidłowym sintax w ogóle zgodnie z aktualnym standardem. Powyższe rozumowanie pokazuje jedynie problemy, które mogłyby powstać, gdybyśmy próbowali interpretować usuwanie p [] przy użyciu istniejących koncepcji języka C++.

+0

Nie, to nie jest równoważne. Użycie jednego zamiast drugiego jest niezdefiniowanym zachowaniem. – sharptooth

+0

@ sharptooth:? przekazanie tablicy do funkcji szablonowej zamiast wskaźnika to UB? Myślę o usuwaniu, jak o szablonowym operatorze, a ten operator nie może wybrać właściwej specjalizacji, ponieważ nie może odróżnić p [] i p przy dedukowaniu argumentu.Musimy więc wprowadzić operatora specjalnego delete [] dla tablic zamiast używać tej samej nazwy operatora – user396672

+0

Przekazanie wskaźnika zwrócony przez 'new' na' delete [] 'to UB – sharptooth

Powiązane problemy