Maison >développement back-end >C++ >La suppression d'un pointeur `void*` avec `delete[]` est-elle sûre en C ?

La suppression d'un pointeur `void*` avec `delete[]` est-elle sûre en C ?

DDD
DDDoriginal
2024-12-05 15:00:18958parcourir

Is Deleting a `void*` Pointer with `delete[]` Safe in C  ?

Suppression de pointeurs vides : une évaluation de la sécurité

Considérez l'extrait de code suivant :

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

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

Est-il sécuritaire de supprimer un pointeur alloué en tant que pointeur void* en utilisant le delete[] opérateur ?

Réponse :

La suppression d'un pointeur via un void* n'est explicitement pas définie par la norme C. La section 5.3.5/3 indique :

Dans la première alternative (supprimer l'objet), si le type statique de l'opérande est différent de son type dynamique, le type statique doit être une classe de base du type dynamique de l'opérande. et le type statique doit avoir un destructeur virtuel ou le comportement n'est pas défini. Dans la deuxième alternative (supprimer le tableau), si le type dynamique de l'objet à supprimer diffère de son type statique, le comportement est indéfini.

De plus, la note de bas de page note :

Cela implique qu'un objet ne peut pas être supprimé à l'aide d'un pointeur de type void* car il n'y a pas d'objet de type void.

Conclusion :

Il est dangereux de supprimer un pointeur alloué en tant que void* à l'aide de l'opérateur delete[]. Convertissez toujours le pointeur vers son type d'origine avant de le supprimer.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn