2010-12-11 92 views
1

Par exemple, les articles disent généralement que si malloc et delete sont associés, ou disent que c'est faux et ne le font pas.Pourquoi la compilation ne génère-t-elle pas une erreur pour le code qui entraîne un comportement indéfini

Mais pourquoi le compilateur ne fait pas de vérification pour nous.

Y aura-t-il des cas où ce type de code est correct et destiné? Pour cette raison, le compilateur ne peut pas toujours dire qu'il est faux de le faire?

Ou est-il techniquement difficile pour le compilateur de faire cela?

Répondre

2

Plusieurs raisons. Du haut de ma tête.

  • Certains comportements non définis peuvent avoir des effets définis en tant qu'extension spécifique à l'implémentation.

  • Un comportement non défini se produit uniquement en fonction de l'environnement ou de l'entrée d'un programme. Le code peut donc provoquer un comportement non défini, mais pas nécessairement.

  • De nombreuses instances de comportement indéfini sont difficiles à diagnostiquer. Cela peut impliquer des éléments potentiellement conflictuels dans les unités de traduction suivantes. Si elles étaient faciles à diagnostiquer, il est probable que la norme nécessiterait une mise en œuvre pour émettre un diagnostic comme dans de nombreux cas.

0

Le compilateur ne sait pas nécessairement si le pointeur a été créé en utilisant new, malloc ou s'il s'agit simplement d'un pointeur vers quelque chose sur la pile. Cependant, les débogueurs de mémoire tels que valgrind peuvent trouver certaines de ces erreurs.

1

Alors, que diriez-vous à ce sujet?

int* p = (int*)malloc(sizeof(p)); 
foobar(&p); 
delete p; 

foobar est dans une unité de compilation différente. Tu ne sais pas ce que ça fait.

1

Il est théoriquement impossible de déterminer si malloc est associé à delete dans certains cas. Imaginez le halting problem et une suppression à la fin du programme.