Non, en raison des tableaux et des détails. Bien sûr, parce que ces problèmes n'ont probablement pas d'importance dans votre base de code.
Tous les suppressions sont de type suppressions spécifiques, ou:
Le comportement de la mise en œuvre de la bibliothèque standard de cette fonction est définie, sauf si ptr est un pointeur nul ou est un pointeur précédemment obtenu à partir de la mise en œuvre de la bibliothèque standard de opérateur new (taille_t) ou opérateur new (taille_t, std :: nothrow_t).
de http://en.cppreference.com/w/cpp/memory/new/operator_delete
Ce moyen de passage mémoire allouée par new[](size_t)
-delete(void*)
est UB, et new[](size_t)
-delete[](void*)
est UB. Deuxièmement, les utilisateurs sont libres de remplacer new/delete sur une base globale ou par classe.
Troisième:
void delete_procedure(Object* obj){
obj->~Object();
::operator delete((void*)obj);
}
vous voulez lancer d'annuler là et utiliser l'opérateur pointeur supprimer.
Forth, le pointeur est passé à delete_procedure
doit être le pointeur généré par new T
ou ::new(::new(sizeof(T))) T
; il ne peut pas s'agir d'un pointeur vers un sous-objet dérivé, car sa valeur en tant que void*
peut différer.
Si T* pt
est castable dynamique, dynamic_cast<void*>(pt)
va reconstruire cela void*
. C'est donc moins une barrière qu'il n'y paraît. N'oubliez pas de faire le casting avant de détruire l'objet!
void delete_procedure_dynamic(Object* obj){
void* ptr=dynamic_cast<void*>(obj);
obj->~Object();
::operator delete(ptr);
}
et d'utiliser SFINAE/tag dispatching pour répartir entre les versions dynamique et non-dynamique. Cinquième, les types d'alignement élevés ont besoin de travail à manipuler. Ils utilisent différents nouveaux et suppriment. Je ne suis pas certain de l'interaction entre le casting dynamique et les types dérivés alignés, mais vous n'avez probablement pas besoin de vous en soucier.
Mais new T
appels ::new(size_t)`` then constructs an object there.
opérateur supprimer (void *) must be fed memory produced by
:: nouveau (size_t) . Destroying an object creates by
nouveau T is legal via
. ~ T() `. Donc, je ne vois rien de fondamentalement brisé. En pratique, ce que je pourrais faire est remplacer le "normal" nouveau pour suivre le même modèle que votre nouveau stockage supplémentaire (et allouer le bloc via new(size_t)
) pour garder les choses simples. Vous êtes en territoire arcanique, pourquoi ne pas rendre les choses uniformes.
Au cas où cela vous intéresse: Pourquoi ai-je besoin de cela? J'écris un ramasse-miettes pour les structures de données concurrentes et certains objets gérés par le GC peuvent être effectivement dimensionnés de manière variable par placement nouveau pour l'efficacité (par exemple métadonnées suivies d'une chaîne c), certains objets pourraient ne pas l'être, et je préférerais sur l'utilisateur pour garder une trace de la différence. – Joe
Aucune procédure de ce type ne peut exister, car vous devez faire correspondre 'delete' avec le' new' correspondant, et de plus, il n'y a pas d '"expression de suppression de placement". –
Toujours utiliser le placement nouveau? –