Frage

Ich spiele mit "von Hand" mit dynamischer Speicherzuweisung und wollte sehen, wie die Platzierung neu von Leuten von MS implementiert wird, aber als ich debuggierte, trat ich in "es bewegte mich zu Code:

inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0()
{   // construct array with placement at _Where
return (_Where);
}

Könnte mir jemand erklären, wie dieser Code mein Objekt von meinem Zeiger in Position bringt, wenn alles, was ich in diesem Code sehen kann, eine Linie mit der Rückgabeanweisung mit dem ist, was ich als Argument angegeben habe. Ich glaube nicht, dass das Sprichwort in Kommentar, was ich von diesem FNC möchte, ausreicht, um zu funktionieren. Vielen Dank für alle konstruktiven Antworten.

War es hilfreich?

Lösung

Der Zweck von operator new ist nur, Speicher für ein Objekt zuzuweisen und den Zeiger in diesen Speicher zurückzugeben. Wenn Sie die Platzierung neu verwenden, sagen Sie dem Compiler im Wesentlichen: "Ich weiß, dass dieser Speicher gut ist, die Zuordnung überspringen und diesen Zeiger für mein Objekt verwenden." Der Konstruktor Ihres Objekts wird dann unter Verwendung des Zeigers aufgerufen operator new Ob es sich nur um Speicher handelte oder nicht, der nur zugeteilt oder mit neuer Platzierung angegeben wurde. operator new selbst hat keinen Einfluss darauf, wie Ihr Objekt konstruiert wird.

Andere Tipps

Denken Sie daran, was, was new T(...) (Als "New-Expression" bezeichnet) tut zwei Dinge: Speicher zuzuweisen und ein Objekt zu initialisieren. Sie können die Initialisierung durch Schreiben von Konstruktoren optimieren. Für die Zuweisung, die Sie schreiben operator new. Also trotz des Namens, operator new macht nur eine Seite dessen, was ein neuer Ausdruck tut.

Neue Platzierung ist da, um ein Objekt in einen vorab allozierten Speicher zu bringen. Sie können Konstrukteure nicht direkt als direkt zugezogene Speicher als als aufrufen this Zeiger. Das einzige, was Sie tun können, ist die Platzierung neu zu verwenden: Dies verwandelt die Zuweisung in ein No-op, sodass nur die Konstruktion übrig bleibt, um erledigt zu werden. Dies

inline void* operator new(size_t, void *p) throw()
{
  return p;
}

ist nur die Implementierung dieses No-op.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top