Adresse zum Konstruktor und new Semantik



  • Ich wollte für einen allokierten Adressbereich den Konstruktor eine Klasse manuell aufrufen, doch irgendwie weigert sich der VC++ Kompiler dies für mich zu tun. Ich komme weder an die Adresse des Konstruktors noch kann das so machen:

    Object* o = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(Object));
    new (o) Object(Parameter);
    

    Da der Kompiler diesen Syntax nicht mag, was der GCC allerdings schluckt.
    Wie kann ich den Konstruktor für einen allokierten Bereich im Arbeitsspeicher mit dem VC++-Kompiler aufrufen?



  • hattu <new> inkludiert?



  • #include <new>
    

    Ansonsten kann es sein, dass andere new -Operatoren überladen sind, und du das Argument nach void* casten musst.

    new (static_cast<void*>(o)) Object(Parameter);
    


  • Ah ok, dachte das wäre nur Syntax. Funktioniert auf jeden Fall mit dem #include <new>, dennoch würde mich noch interessieren wieso ich denn nicht an die Adresse des Konstruktors kommen darf.


  • Mod

    dennoch würde mich noch interessieren wieso ich denn nicht an die Adresse des Konstruktors kommen darf.

    Wenn in deinem Code ein new -Ausdruck vorkommt, wird der Speicher für das Objekt mit einer Operatorfunktion mit Namen operator new besorgt.

    Es gibt zwei implizit deklarierte operator new 's, sprich, solche die vom Compiler selbst am Anfang jeder Übersetzungseinheit deklariert werden und daher nicht das Einbinden irgendeines Headers erfordern:

    void* operator new(std::size_t);
    void* operator new[](std::size_t);
    

    Das sind genau diejenigen die bei einem gewöhnlichen new -Ausdruck benötigt werden.

    Bei new int wird der Speicher per operator new(sizeof(int)) alloziert. Dementsprechend wird die erste der beiden Funktionen oben aufgerufen.
    Und new int[a] resultiert im Aufruf von operator new[]( sizeof(int)*a ) (beachte das zusätzliche Klammerpaar). Soweit kommen wir mit den beiden Operatorfunktionen oben aus.

    Wenn du allerdings new (address) int schreibst, dann passt der implizit deklarierte operator new nicht - denn der Aufruf, der nun gemacht wird um den Speicher zu 'allozieren', ist operator new(sizeof(int), address) . Und keine der Funktionen oben passt!
    Aber diese tut es:

    void* operator new  ( std::size_t count, void* ptr );
    

    Und sie ist, zusmmen mit anderen, in <new> deklariert.
    Alle in <new> deklarierten Operatorfunktionen sind hier aufgelistet.

    Wenn du <new> nicht einbidest, wird diese Operatorfunktion nicht vom name lookup gefunden und das ganze resultiert in einem Fehler.


Log in to reply