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.
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
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. –