2010-04-23 11 views
8

in C, gibt void* zurück. Aber in C++, was gibt new zurück?Was ist der Rückgabetyp von Neu in C++?

double d = new int; 
+5

@Suma: Während ich mit Ihren Gefühlen gegenüber KAM Fragen grundsätzlich einverstanden sind, glaube ich, dass dies ein echt ist und die wichtige Unterscheidung zwischen einem _new EXPRESSION_ und dem _new operator_ ist schwer zu finden, wenn nach "operator new" gegoogelt wird. – sbi

+7

@Suma: Eine schlechte Frage kann immer noch zu guten Antworten führen. –

+0

http://stackoverflow.com/questions/240212/what-is-the-difference-between-new-delete-and-malloc-free –

Antwort

8

Typ Wert zurückgegeben von beiden new Type[x] und new Type ist Type *. Ihr Beispiel double d = new int enthält zwei Fehler:

  • Sie müssen das Ergebnis in einen Zeiger zuweisen, wie folgt aus: double *d = new int
  • der Zeiger muss ein Zeiger auf sein Typ oder etwas, das kann ein Zeiger umgewandelt werden Typ mit impliziten Konvertierungen: int *d = new int oder void *d = new int
30

Es gibt zwei Dinge, die Sie unterscheiden müssen. Einer ist ein neuer Ausdruck. Es ist der Ausdruck new T und sein Ergebnis ist ein T*. Es macht zwei Dinge: Erstens, es ruft die neuen Betreiber- Speicher zuzuweisen, und den Konstruktor für T. ruft (Wenn der Konstruktor mit einer Ausnahme bricht, wird es auch die Operator löschen rufen.)

Die vorgenannte neuen Betreiber, kommt jedoch in verschiedenen Geschmacksrichtungen. Der prominenteste ist dieser:

Sie könnten es explizit nennen, aber das ist selten jemals getan.

Es gibt andere Formen des neuen Betreibers, zum Beispiel für Arrays

void* operator new[](std::size_t); 

oder die so genannte Platzierung neue (was wirklich ein fake-neu ist, da es keine Zuteilung von):

void* operator new(void*, std::size_t); 
+0

Zum Beispiel int * p = new int, es gibt int * zurück, dann wie hat die Signatur void *? – kam

+1

Große Antwort auf eine dumme Frage. Das Plakat scheint nicht zu wissen, wie "neu" in die Sprache passt. Die Antwort erklärt dies sehr schön. – Suma

+0

"int p = neuer int, es gibt int zurück", tut es nicht. Ich gebe int * (Zeiger auf int) zurück. – Suma