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 nachvoid*
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.
-
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 Namenoperator 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 peroperator new(sizeof(int))
alloziert. Dementsprechend wird die erste der beiden Funktionen oben aufgerufen.
Undnew int[a]
resultiert im Aufruf vonoperator 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 deklarierteoperator new
nicht - denn der Aufruf, der nun gemacht wird um den Speicher zu 'allozieren', istoperator 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.