Тривіальний випадок, який ви показуєте, може бути виявлений під час компіляції, оскільки інстанція та знищення об'єкта знаходяться в однаковій мірі. Загалом, видалення не в тому ж обсязі або навіть у тому самому вихідному файлі, що і інстанція. А тип вказівника C ++ не несе інформації про те, чи посилається він на один об'єкт свого типу або масив, не кажучи вже про схему розподілу. Тож неможливо діагностувати це взагалі під час компіляції.
Чому б не діагностувати спеціальні випадки, які можливі?
У C ++ вже є інструменти для боротьби з витоком динамічних ресурсів, прив’язаних до областей, а саме розумні покажчики та масиви вищого рівня ( std::vector
).
Навіть якщо ви використовуєте правильний delete
аромат, ваш код все ще не є винятком безпечним. Якщо код між new[]
і delete[]
закінчується динамічним виходом, видалення ніколи не виконується.
Що стосується виявлення часу виконання, Valgrind
інструмент робить гарну роботу з виявлення цього під час виконання. Дивитися:
==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)
Звичайно, Valgrind працює не на всіх платформах, і не завжди практично або можливо відтворити всі ситуації під час роботи інструменту.