Warum darf der neue Operator * void für jeden Zeigertyp zurückgeben?

8

In C ++ ist es nicht erlaubt, einen void * Zeiger auf einen ganzzahligen Zeiger ohne explizite Umwandlung zu setzen. Dies erfordert die Verwendung eines static_cast.

Aber was ist damit?

%Vor%

Ich weiß, dass der neue Operator wie folgt definiert ist:

%Vor%

Wie geht C ++ damit um? Ich weiß, dass dies eine grundlegende Frage ist, aber wichtig. Ich weiß auch, dass Low-Level-Code void verwenden muss. Aber wie kann dieser Auftrag legal sein? iptr ist ein Zeiger auf einen int und new gibt einen Zeiger auf void zurück, der eine Meldung wie "error: invalid conversion von 'void *' zu 'int *' [-fpermissiv]" auslösen sollte.

    
Peter 22.01.2012, 16:11
quelle

1 Antwort

19

Sie haben den Operator new und die Funktion operator new verwechselt. Kein Problem, jeder tut es. Sie sind fast gleich, nur dass sie anders sind.

Die Funktion void* operator new(size_t) ergreift einen Block aus unformatiertem Speicher aus dem Baum, auf dem sie wächst, und gibt ihn an das Programm zurück.

%Vor%

Es ist eine gewöhnliche Funktion mit etwas seltsamen Namen.

Der neue -Operator ist keine Funktion und kein Funktionsaufruf. Es ist ein separates Sprachkonstrukt. Es nimmt rohen Speicher (normalerweise von der Funktion void* operator new(size_t) zurückgegeben) und verwandelt es in ein Objekt, indem es einen Konstruktor aufruft. Es gibt dann einen korrekt typisierten Zeiger auf das neu erstellte Objekt zurück.

%Vor%

UPDATE Natürlich gibt es auch den delete -Operator (das Gegenteil des new -Operators) und die void operator delete(void*) -Funktion (das Gegenteil der Funktion void* operator new(size_t) ).

Es gibt auch den Operator new [] , den Operator delete [] , die Funktion void* operator new[](size_t) und die Funktion void operator delete[](void*) . Sie befassen sich mit Arrays von Objekten (im Gegensatz zu einzelnen Objekten).

Es gibt auch sogenannte "placement new" -Formulare, die keine der operator new -Funktionen für neuen Speicher aufrufen, sondern stattdessen einen expliziten Zeiger auf den Rohspeicher benötigen. Sie haben keine entsprechenden integrierten "Lösch" -Formulare. Sie können Ihre eigenen rollen, wenn Sie so geneigt sind, aber ich weigere mich, darüber zu sprechen, während ich nüchtern bin.

    
n.m. 22.01.2012, 16:20
quelle

Tags und Links