91 votes

Est-il sécuritaire de supprimer un vide pointeur?

Supposons que j'ai le code suivant:

void* my_alloc (size_t size)
{
   return new char [size];
}

void my_free (void* ptr)
{
   delete [] ptr;
}

Est-il sécuritaire? Ou doit - ptr être jeté à l' char* avant la suppression?

25voto

Brian R. Bondy Points 141769

Ce n'est pas une bonne idée et pas quelque chose que vous faites en C++. Vous perdez vos informations de type pour aucune raison.

Votre destructeur ne sera pas appelé sur les objets de votre groupe que vous souhaitez supprimer lorsque vous appelez pour des types primitifs.

En revanche, vous pouvez remplacer new/delete.

La suppression de l'void* sera probablement libérer votre mémoire correctement par hasard, mais c'est faux, car les résultats ne sont pas définis.

Si, pour une raison inconnue de moi, vous avez besoin de stocker le pointeur de la souris dans un void* puis gratuitement, vous devez utiliser malloc et free.

25voto

Christopher Points 5252

Il dépend de "coffre-fort". Il fonctionne habituellement parce que l'information est stockée avec le pointeur sur l'allocation elle-même, de sorte que le deallocator pouvez le retourner à la bonne place. En ce sens, il est "sûr" aussi longtemps que votre allocateur utilise de la frontière interne des balises. (Beaucoup le font.)

Cependant, comme mentionné ci-dessus, la suppression d'un pointeur void ne vais pas appeler les destructeurs, qui peut être un problème. En ce sens, il n'est pas "sans danger".

Il n'y a aucune bonne raison pour faire ce que vous faites de la façon dont vous le faites. Si vous voulez écrire vos propres fonctions de libération de la mémoire, vous pouvez utiliser les modèles de fonction pour générer des fonctions avec le type correct. Une bonne raison de le faire est de générer de la piscine allocateurs, qui peut être extrêmement efficace pour des types spécifiques.

13voto

JaredPar Points 333733

La suppression d'un pointeur void est dangereux parce que les destructeurs ne sera pas appelé à la valeur qu'elle renvoie. Cela peut résultat en mémoire / ressources des fuites dans votre application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X