El caso trivial que muestra puede detectarse en tiempo de compilación, porque la creación de instancias y la destrucción del objeto están en el mismo ámbito. En general, la eliminación no está en el mismo alcance, o incluso en el mismo archivo fuente, que la instanciación. Y el tipo de puntero de C ++ no contiene información sobre si hace referencia a un solo objeto de su tipo o una matriz, y mucho menos el esquema de asignación. Por lo tanto, no es posible diagnosticar esto en tiempo de compilación en general.
¿Por qué no diagnosticar los casos especiales que son posibles?
En C ++ ya hay herramientas para lidiar con la fuga de recursos dinámicos que están vinculados a ámbitos, a saber, punteros inteligentes y matrices de nivel superior ( std::vector
).
Incluso si usa el delete
sabor correcto , su código aún no es salvo para excepciones. Si el código entre new[]
y delete[]
termina con una salida dinámica, la eliminación nunca se ejecuta.
En cuanto a la detección en tiempo de ejecución, la Valgrind
herramienta hace un buen trabajo al detectar esto en tiempo de ejecución. Reloj:
==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)
Por supuesto, Valgrind no se ejecuta en todas las plataformas, y no siempre es práctico o posible reproducir todas las situaciones de tiempo de ejecución bajo la herramienta.