2010-03-21 20 views
2

Je ne sais pas si ces deux œuvres pour supprimer:Supprimer un seul tableau d'objet?

p = new int[1]; 

delete p 

et

delete [] p; 

Si les deux œuvres, quelle est la différence entre les deux ci-dessus delete s?

+1

Les 'new' et' delete' doivent correspondre, ou vous avez un comportement indéfini. Sembler travailler sur une plate-forme est un résultat possible d'un comportement indéfini, tout comme tout s'écraser terriblement. Ne fais pas ça. – GManNickG

Répondre

1

delete p supprime un seul élément. delete [] p supprime un tableau. Si vous utilisez new type[], utilisez delete [].

Si vous êtes new a un [], alors delete a un []. Par ailleurs, il doit y avoir un duplicata exact de ce quelque part.

4

Un tableau d'une instance est toujours un tableau. Il n'y a tout simplement pas de cas particulier, vous devez donc le traiter comme un tableau et non comme un seul objet. Non-tableau delete peut se bloquer.

Un tableau d'objets peut être précédé d'un nombre indiquant la taille du tableau. Si c'est le cas, delete[], pas delete, est assez intelligent pour passer le bon pointeur à free.

2

Ils sont et non de même. Même si delete p serait compiler mais pourrait potentiellement causer des problèmes à l'exécution.

delete p invoquera operator delete(void*)delete [] appellera operator delete[](void*). Le comportement par défaut est delete[] pour appeler delete mais si un opérateur personnalisé pour delete [] a été implémenté, il ne sera pas appelé si vous appelez simplement delete et vous aurez un problème (probablement silencieux).

La bonne règle est que si vous avez utilisé [] dans le new, utilisez-le dans le delete.

+0

Pas une règle générale, une exigence. – GManNickG

Questions connexes