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é à char* avant la suppression?

  • Pourquoi faites-vous la gestion de la mémoire vous-même? Quelle structure de données êtes-vous créer? Avoir besoin de faire explicite de gestion de la mémoire est assez rare en C++, vous devez généralement utiliser les classes qui en chargera pour vous de la STL (ou de coup de pouce dans une pincée).
  • Juste pour les gens qui lisent, j'utilise void* variables comme paramètres pour mon fils en gagner c++ ( voir _beginthreadex ). Habituellement, ils sont acutally pointant vers des classes.
  • Dans ce cas, il est d'un usage général wrapper pour new/delete, qui pouvait contenir le suivi de l'allocation des statistiques, par une optimisation de la mémoire de la piscine. Dans d'autres cas, j'ai vu des pointeurs d'objet mal stocké comme void* variables de membre, et supprimé de manière incorrecte dans le destructeur sans coulée de retour pour le type d'objet approprié. J'ai donc été curieux au sujet de la sécurité/pièges.
  • Pour un usage général wrapper pour new/delete, vous pouvez surcharger le nouveau/supprimer des opérateurs. En fonction de l'environnement que vous utilisez, vous avez probablement des crochets dans la gestion de la mémoire pour le suivi des allocations. Si vous vous retrouvez dans une situation où vous ne savez pas ce que votre sont la suppression, le prendre comme un indice que votre conception est sous-optimale et les besoins de refactoring.
  • Puisque vous êtes déjà emballage de la répartition et de la destruction, vous pouvez facilement moulé avec pas de frais généraux.
  • Pouvez penser à des charges de raisons pourquoi vous voulez le faire en c++, par exemple, disons que vous avez une base de données de vos besoins du programme, il a été exporté dans un format binaire, et vous voulez être en mesure de charger cette base de données traitées dans un seul bloc de mémoire... ou si vous avez votre propre système de fichiers virtuel (bien que j'attends de ce genre de techniques sont probablement plus utile dans le développement d'un jeu où la performance est critique
  • Je pense qu'il y a trop de questionner la question au lieu d'y répondre. (Et pas seulement ici, mais dans l'ensemble DONC)
  • Mais sérieusement, @Andrew suffit d'utiliser malloc et free directement. Que contient implicitement le fait que le constructeur/destructeur ne sera pas appelé (comme les réponses ci-dessous le dire) sur ce que sous-tend que void* pointeur.
  • Depuis le char n'a pas de destructeur, ce sera à l'abri. malloc/free serait plus rapide, mais alors vous perdez std::bad_alloc.
  • J'utilise un void* en tant que contexte qui est passé pour moi en code C# et dont le type sera en un tiers de code C++ mise en œuvre d'une base de classe de plugin que j'offre. Dans mon cas, tout ce qui était nécessaire était de faire delete (MyPluginBase*) aPointer et de s'assurer que MyPlugin a un destructeur virtuel.

InformationsquelleAutor An̲̳̳drew | 2009-06-02