Ora provate con riempimento della matrice con stringhe di 100 byte ciascuno, e vedere se libera ancora tutta la memoria allocata ...
È comportamento indefinito, e come sempre, apparirà talvolta UB lavorare. Nel tuo caso, non hai un distruttore per gli oggetti nella memoria, quindi non c'è "ulteriore lavoro", solo libera tutta la memoria [1]. Ma se hai un oggetto che ha un distruttore che fa qualcosa di utile, non verrà chiamato (probabilmente).
È consigliabile utilizzare SEMPRE delete []
se si utilizza new T[size];
da allocare. Non mescolare i due, è sempre sbagliato - solo a volte FUNZIONA per funzionare [proprio come ALCUNE misure di chiavi in pollici funzionano con dadi mm e viceversa - ma è ancora sbagliato usare una chiave inglese impostata sui dadi metrici].
[1] Si noti che questo potrebbe funzionare per questa particolare combinazione di librerie compilatore/C++. La compilazione con un compilatore diverso, l'utilizzo di una diversa libreria C++ o la compilazione per un diverso sistema operativo può causare il crash quando si tenta la stessa cosa.
fonte
2013-08-04 19:15:05
AFAIK questo è UB. – Borgleader
"Perché funziona?" - no, sembra funzionare. –
Senza le parentesi, si chiama solo un distruttore, non tutti i distruttori dell'array. Vedi anche http://stackoverflow.com/questions/2425728/delete-vs-delete-operators-in-c – GreatBigBore