2011-07-15 2 views
2

J'utilise le RTL comme bibliothèque dynamique. Cela permet un opérateur de suppression/suppression nouveau dans l'espace de noms global, car l'éditeur de liens trouve d'abord mon implémentation. Je pourrais compter sur malloc() et free() pour faire les choses d'allocation, mais il y a des choses comme les objets 'new_handlers' et 'std :: nothrow'. Les modèles de bibliothèque standard requièrent un certain comportement des opérateurs nouveaux/supprimés, mais l'implémentation de la bibliothèque standard dans new/delete dans l'espace de noms global est hors de portée! Existe-t-il une implémentation dans un autre espace de nom de la bibliothèque standard que je peux utiliser?Quelle implémentation par défaut de new/delete de std-rtl dois-je utiliser lors de la substitution de new/delete dans l'espace de noms global?

Je peux déterminer dynamiquement l'adresse de la mise en œuvre de la bibliothèque standard (dans la DLL) et l'appeler via un pointeur, mais cela ne fait pas l'objet d'une récompense de beauté. Toujours ce travail? (J'utilise borland C++ builder 2006).

EDIT Je veux poser cette question:

Est-ce que cet exemple de code se comporte similaire à l'opérateur de RTL nouveau (size_t)? Ou l'ai-je mal compris?

void *new_replacement(size_t p_size) 
{ 
    void *l_retval = NULL; 

    while(l_retval == NULL && p_size != 0) 
    { 
     l_retval = malloc(p_size); 
     if (l_retval == NULL) 
     { 
      void (*l_handler)() = std::set_new_handler(NULL); 

           // could not find another way to obtain the current new_handler 
      if (l_handler == NULL) throw std::bad_alloc(); 
      std::set_new_handler(l_handler); 
      l_handler(); 
     } 
    } 
    return l_retval; 
} 

Répondre

2

Vous avez replaced, not overridden l'implémentation par défaut et vous ne pouvez plus appeler. Vous devrez le réimplémenter - par exemple en utilisant malloc() et en prenant soin de sa valeur de retour, ce n'est pas très difficile.

+0

Alors est l'utilisation de l'option pour l'appeler à travers un pointeur. Il y a trop de choses à faire pour écrire ma propre imputation. –

+0

Si ce n'est pas difficile, pourriez-vous donner un exemple de code comment le faire comme le std-rtl le fait? –

+1

@ bert-jan: Cette réponse http://stackoverflow.com/questions/4134195/how-do-i-call-the-original-operator-new-if-i-have-overloaded-it/4134355#4134355 décrit dans les détails. – sharptooth

Questions connexes