Il caso banale che mostri può essere rilevato al momento della compilazione, perché l'istanziazione e la distruzione dell'oggetto sono nello stesso ambito. In generale, la cancellazione non è nello stesso ambito, o anche lo stesso file sorgente, come l'istanziazione.
E un tipo di puntatore del C ++ non porta informazioni sul fatto che faccia riferimento a un singolo oggetto del suo tipo o a un array, per non parlare dello schema di allocazione. Quindi non è possibile diagnosticare questo al momento della compilazione in generale.
Perché non diagnosticare casi speciali che sono possibili?
In C ++ esistono già strumenti per gestire la perdita di risorse dinamiche legate agli ambiti, ovvero puntatori intelligenti e matrici di livello superiore ( std::vector
).
Anche se utilizzi il corretto delete
flavor, il tuo codice non è ancora sicuro. Se il codice tra new[]
e delete[]
termina con un'uscita dinamica, la cancellazione non viene mai eseguita.
Per quanto riguarda il rilevamento del tempo di esecuzione, lo strumento Valgrind
fa un buon lavoro nel rilevare questo in fase di esecuzione. Guarda:
==26781== Command: ./a.out
==26781==
==26781== Mismatched free() / delete / delete []
==26781== at 0x402ACFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==26781== by 0x8048498: main (in /home/kaz/test/a.out)
==26781== Address 0x4324028 is 0 bytes inside a block of size 80 alloc'd
==26781== at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==26781== by 0x8048488: main (in /home/kaz/test/a.out)
Ovviamente, Valgrind non funziona su tutte le piattaforme e non è sempre pratico o possibile riprodurre tutte le situazioni di runtime sotto lo strumento.