Тривиальный случай, который вы показываете, может быть обнаружен во время компиляции, потому что создание экземпляров и уничтожение объекта находятся в одной и той же области видимости. Как правило, удаление находится не в той же области или даже в том же исходном файле, что и экземпляр. И тип указателя 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 работает не на всех платформах, и не всегда возможно или невозможно воспроизвести все ситуации во время выполнения с помощью инструмента.