Der Aufruf int *a = new(__FILE__, __LINE__) int;
kann die Funktion void* operator new(size_t , const char *, unsigned int);
aufrufen.Wie ruft der Aufruf 'neu' die benutzerdefinierte Placement-Zuweisungsfunktion auf?
Wie funktioniert es?
Der Aufruf int *a = new(__FILE__, __LINE__) int;
kann die Funktion void* operator new(size_t , const char *, unsigned int);
aufrufen.Wie ruft der Aufruf 'neu' die benutzerdefinierte Placement-Zuweisungsfunktion auf?
Wie funktioniert es?
Jeder Operator in C++ hat eine spezifische Syntax und semantische Anforderungen, die auch nach Überlastung eingehalten werden müssen. Z.B. Selbst wenn Sie den Operator ^
überladen, um power
darzustellen, können Sie nicht erwarten, dass er eine höhere Priorität hat als die Multiplikation *
, was in Algebra der Fall sein wird.
Der Operator new
hat eine Syntaxanforderung wie folgt.
new (arguments ... /*for specialized case*/) Type (initializer list);
new (arguments ... /*for specialized case*/) Type [size_t];
also in der Lage sein void* operator new (std::size_t count, void* ptr);
man folgenden Code zu verwenden, zu schreiben.
int main()
{
char arr[sizeof(int)];
int *a = new(arr) int;
}
Während void* operator new (std::size_t count);
kann ohne Störungen als aufgerufen werden.
int main()
{
int *a = new int;
}
also alle Argumente mit Ausnahme des ersten (die es automatisch von Typ deduziert) zwischen new
und type
und sollten in geschlossenen parenthesis
platziert werden.
Also, in Ihrem Beispiel int *a = new(__FILE__, __LINE__) int;
, Syntaxregeln von neuen, sucht operator new(std::size_t count, char const *, int)
Um ... Es funktioniert buchstäblich wie Sie es gesagt. Der Ausdruck 'new (__ FILE__, __LINE__) int' versucht intern, die Funktion' :: operator new' mit der entsprechenden Parameterliste aufzulösen und aufzurufen. – AnT
[neuer Ausdruck] (http://en.cppreference.com/w/cpp/language/new) – Bumzy