Maison >développement back-end >C++ >Comment remplacer universellement les opérateurs globaux « nouveau » et « supprimer » dans les grandes bases de code ?

Comment remplacer universellement les opérateurs globaux « nouveau » et « supprimer » dans les grandes bases de code ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-03 13:08:02702parcourir

How to Universally Override Global `new` and `delete` Operators in Large Codebases?

Remplacer efficacement les opérateurs globaux de création et de suppression

Problème :

Remplacement des opérateurs globaux nouveau et Les opérateurs de suppression pour utiliser la gestion de mémoire personnalisée présentent des défis dans les bases de code à grande échelle. Il n'est pas pratique d'inclure le fichier d'en-tête contenant les surcharges dans chaque fichier. Comment garantir l'adoption universelle de ces surcharges ?

Solution :

Le remplacement des opérateurs new et delete est un processus effectué au moment de la liaison. En créant une unité de traduction (TU) distincte qui définit les opérateurs et en la liant au projet, on peut remplacer globalement les opérateurs par défaut sans modifier la base de code existante.

Exemple de code :

Voici un exemple de TU définissant les opérateurs new et delete :

<code class="cpp">// optional_ops.cpp

void * operator new(std::size_t n) throw(std::bad_alloc)
{
  //...
}

void operator delete(void * p) throw()
{
  //...
}</code>

Y compris l'opérateur l'en-tête n'est pas requis car les déclarations de l'opérateur new et de l'opérateur delete sont codées en dur dans le langage. Cependant, des noms tels que std::bad_alloc et std::size_t peuvent devoir être déclarés.

Alternative pour C 11 et versions ultérieures :

C 11 introduit une manière plus simple de définir la nouvelle surcharge, en utilisant decltype(sizeof(0)) pour déterminer le type du paramètre size :

<code class="cpp">void * operator new(decltype(sizeof(0)) n) noexcept(false)
{
  //...
}</code>

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