Supposons que je doive surcharger global ::operator new()
for storing extra data with each allocated object. Donc, fondamentalement, il marcherait ainsi:Comment appeler l'original "operator new" si je l'ai surchargé?
- pour chaque appel à
::operator new()
mondial, il prendra la taille de l'objet passé et ajouter la taille des données supplémentaires - il allouer un bloc de mémoire de taille déduite au précédent étape
- il compensera le pointeur sur la partie du bloc non occupé avec des données supplémentaires et retour que la valeur de décalage à l'appelant
::operator delete()
va faire la même chose en sens inverse - sh ift le pointeur, accède à des données supplémentaires, libère la mémoire.
Maintenant la question est comment allouer la mémoire? Bien sûr, je peux appeler malloc()
ou une fonction spécifique à la plate-forme (c'est comme cela que cela se fait habituellement). Mais normalement, quand j'ai besoin d'allouer de la mémoire brute en C++, j'appelle ::operator new()
. Puis-je appeler l'original ::operator new()
pour faire l'allocation de mémoire à l'intérieur de mon global surchargé ::operator new()
?
Voulez-vous dire surchargé ou remplacé? En cas de surcharge, appelez simplement l'opérateur d'origine new en utilisant le bon jeu d'arguments. Si remplacé, non vous ne pouvez pas mais je crois que c'est _why_ 'malloc' est garanti de ne pas utiliser' operator new' dans son implémentation (ie pas de boucles involontaires quand l'opérateur new est remplacé) donc vous devriez probablement utiliser 'malloc' . –
@CharlesBailey Vous avez écrit votre réponse comme un commentaire! pour la honte! –