La surcharge de l'opérateur new pour une classe

Lorsque nous la surcharge d'opérateur de classe, nous déclarer la fonction comme une fonction membre.
Pour exemple:

class OpNew {
public:
    OpNew() { cout << "OpNew::OpNew()" << endl;}
    void* operator new(size_t sz) {
         cout << "OpNew::new: "
            << sz << " bytes" << endl;
         return ::new char[sz];
    }
};

Comment la déclaration OpNew *obj = new OpNew travail sous le capot ? de la surcharge du nouveau, c'est un membre de OpNew classe non statique. Alors, comment ne compilateur assurer cet appel à new membre de la fonction réussit?

  • Il doit être statique.
  • J'espère que vous surchargé operator delete aussi bien, sinon vous avez un comportement indéfini.
  • Bien sûr, je l'ai fait, c'était juste un extrait 🙂
  • N Fetissov Ce qui devrait être statique? opérateur de nouveau est toujours statique; vous n'avez pas à déclarer statique (et je ne suis même pas sûr que c'est légal de le faire).
  • oui, operator new et operator delete. Ils sont implicitement static. Il est légal de le déclarer explicitement. Qui aurait été nécessaire de l'obtenir-aller pour éviter exactement ce soft de confusion.
  • Opérateur surchargé nouveau type void*. Comment se fait que dans l'état OpNew *obj = new OpNew nous avons obtenu la conversion de void* -> OpNew*? Ces coversions ne peut pas être fait de façon implicite en C++, peuvent-ils?
  • Le void* est consommée par le C++ lui-même, il n'est pas "converti" à T*. Un objet est créé à l'intérieur de la mémoire (nécessitant un appel du constructeur), et un pointeur vers le nouvel objet est renvoyée au programme. Ne pas confondre T::operator new(sizeof T) et new T - la première est qu'une très petite partie de ce que la seconde implique.
  • Plus Efficace C++ est la source de la stricte conseils: lorsque vous écrivez un placement version de l'opérateur new, assurez-vous d'écrire les placement version de l'opérateur delete (citant Effective C++, mon accent). Semble que pour seulement surcharger le défaut de mise en place de la nouvelle version de l'opérateur, il n'est pas obligatoire de surcharge de supprimer également. Ce qui a du sens que si vous allez sur les raisons mentionnées à l'Article 52.

InformationsquelleAutor | 2011-03-23