2016-10-20 2 views
1

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?

+2

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

+0

[neuer Ausdruck] (http://en.cppreference.com/w/cpp/language/new) – Bumzy

Antwort

4

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)

Verwandte Themen