Le cas trivial que vous montrez peut être détecté au moment de la compilation, car l'instanciation et la destruction de l'objet ont la même portée. En général, la suppression n'a pas la même portée, ni même le même fichier source, que l'instanciation. Et le type d'un pointeur C ++ ne contient pas d'informations sur s'il fait référence à un seul objet de son type ou à un tableau, sans parler du schéma d'allocation. Il n'est donc pas possible de diagnostiquer cela au moment de la compilation en général.
Pourquoi ne pas diagnostiquer les cas particuliers qui sont possibles?
En C ++, il existe déjà des outils pour gérer les fuites de ressources dynamiques liées aux étendues, à savoir les pointeurs intelligents et les tableaux de niveau supérieur ( std::vector
).
Même si vous utilisez la bonne delete
saveur, votre code n'est toujours pas sûr d'exception. Si le code entre le new[]
et se delete[]
termine par une sortie dynamique, la suppression ne s'exécute jamais.
En ce qui concerne la détection au moment de l'exécution, l' Valgrind
outil fait un bon travail de détection lors de l'exécution. Regarder:
==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)
Bien sûr, Valgrind ne fonctionne pas sur toutes les plates-formes, et il n'est pas toujours pratique ou possible de reproduire toutes les situations d'exécution sous l'outil.