2010-04-28 4 views
2

J'ai écrit un petit programme dans VS2005 pour tester si l'opérateur global C++ new peut être surchargé. Ça peut.Sur l'opérateur global C++ nouveau: pourquoi il peut être remplacé

#include "stdafx.h" 
#include "iostream" 
#include "iomanip" 
#include "string" 
#include "new" 

using namespace std; 

class C { 
    public: 
     C() { cout<<"CTOR"<<endl; } 
}; 

void * operator new(size_t size) 
{ 
    cout<<"my overload of global plain old new"<<endl; 
    // try to allocate size bytes 
    void *p = malloc(size); 
    return (p); 
} 

int main() { 
    C* pc1 = new C; 
    cin.get(); 
    return 0; 
} 

Dans ce qui précède, ma définition d'opérateur new est appelée. Si je supprime cette fonction du code, alors l'opérateur new dans C: \ Program Files (x86) \ Microsoft Visual Studio 8 \ VC \ crt \ src \ new.cpp est appelé.

Tout est bon. Cependant, à mon avis, mes implémentations d'opérateur new ne surchargent PAS le nouveau dans new.cpp, il CONFLICTE avec celui-ci et viole la règle de définition unique. Pourquoi le compilateur ne s'en plaint-il pas? Ou est-ce que la norme dit que l'opérateur new est si spécial, la règle de définition unique ne s'applique pas ici?

Merci.

+3

Notez que vous devez toujours implémenter un 'opérateur delete 'correspondant à chaque' operator new' que vous implémentez. (Je sais que c'était juste pour montrer votre point de vue, mais je ne peux pas me permettre de le laisser sans cet avertissement.) – sbi

+1

Peut-être devriez-vous éditer le titre de la question, je pensais que vous vouliez connaître les diverses utilisations pour remplacer quand, en fait, vous vouliez savoir pourquoi le remplacer n'a pas provoqué d'erreur. –

Répondre

7

Oui, global operator new est spécial en ce que les programmes peuvent fournir une implémentation de remplacement pour cela.

Les formes remplaçables sont les formes d'objet unique et de matrice operator new et operator delete et les variantes «sans projection». D'autres formes, telles que le placement nouveau ne sont pas remplaçables.

+0

retourner au travail :-) – Simon

+1

@Simon: C'est l'heure du déjeuner :-) –

+0

ok alors, il y a un upvote pour vous – Simon

Questions connexes