2015-05-02 9 views
10
new delete 

oderWas ist der Unterschied zwischen new/delete und :: new/:: delete?

::new ::delete 

Ich frage mich, die Verwendungen dieser :: wie es funktioniert normalerweise scheint, wenn ich sie entfernen.

Dies sind alle Codes, die im Lernprogramm des automatischen Zeigers geschrieben werden.

#include <cstddef> 
size_t* alloc_counter(){ 
    return ::new size_t; 
} 
void dealloc_counter(size_t* ptr){ 
    ::delete ptr; 
} 

Antwort

9

Sie können new für eine Klasse überschreiben, aber ::new sucht immer im globalen Gültigkeitsbereich. Dh:

class A { 
    void* operator new(std::size_t sz) { 
     /* 1 */ } 
}; 

void* operator new(std::size_t sz) { 
     /* 2 */ } 

void f() { 
    A* a1 = new A; // calls A::new (1) 
    A* a2 = ::new A; // calls implementation 2 or compiler's new 
} 

Die in § beschrieben 5.3.4 New Satz 9:

Wenn der neue Ausdruck mit einem unären :: Operator beginnt, die Name der Zuordnungsfunktion nachgeschlagen in der globale Umfang. Wenn der zugewiesene Typ andernfalls eine Klassenart T oder ein Array davon ist, wird der Name der Zuweisungsfunktion im Bereich T nachgeschlagen. Wenn dieser Suchvorgang den Namen nicht finden kann oder der zugeordnete Typ kein Klassentyp ist, wird der Name der Zuordnungsfunktion im globalen Gültigkeitsbereich nachgeschlagen.

(Stand N3797 Entwurf)

Gleichfalls delete gilt und ::delete

+0

Was die Logik hinter _not_ ruft ein extra-for-this-Art-überladene 'new' /' löschen '? – nonsensation

+0

@Serthy: Wenn Sie Objekte aus _big freigegebenen Pool_ zuweisen, aber manchmal nur temporäre Objekte für Ihren Prozess benötigen? – myaut

6

::new und ::delete sind die Betreiber auf globaler Tragweite. Sie verwenden diese Syntax, wenn Sie für Ihre Klasse new und delete überladen. In letzterem Fall führt der Aufruf von new in Ihrem überladenen new zu einer unendlichen Rekursion, wenn Sie den Operator aufrufen, den Sie gerade definieren.

Verwandte Themen