Teraz spróbuj go z wypełniania tablicę ciągów po 100 bajtów każdy, i sprawdzić, czy nadal zwalnia całą przydzieloną pamięć ...
Jest niezdefiniowane zachowanie, i jak zawsze pojawi czasami UB pracować. W twoim przypadku nie masz destruktora dla obiektów w pamięci, więc nie ma "dalszej pracy", po prostu zwolnij całą pamięć [1]. Ale jeśli masz obiekt, który ma destruktor, który robi coś użytecznego, to (prawdopodobnie) nie zostanie wywołany.
Powinieneś ZAWSZE używać delete []
, jeśli użyłeś new T[size];
do przydzielenia. Nie mieszaj tych dwóch, zawsze jest źle - tylko czasami to DZIAŁA, żeby działać [tak, jak NIEKTÓRE rozmiary kluczy w calach działają na nakrętki mm i odwrotnie - ale nadal nie należy używać klucza płaskiego z nakrętkami metrycznymi].
[1] Uwaga: może to działać dla tej konkretnej kombinacji biblioteki kompilatora/C++. Kompilowanie go z innym kompilatorem, używanie innej biblioteki C++ lub kompilowanie dla innego systemu operacyjnego może spowodować awarię, gdy spróbujesz tego samego.
AFAIK to UB. – Borgleader
"Dlaczego to działa?" - nie, wydaje się, że działa. –
Bez nawiasów wywołujesz tylko jeden destruktor, a nie wszystkie destruktory w tablicy. Zobacz także http://stackoverflow.com/questions/2425728/delete-vs-delete-operators-in-c- – GreatBigBore