2013-05-02 20 views
6

Questa è una semplice domanda:Il nuovo ritorno (void *) in C++?

Il nuovo operatore utilizza un puntatore di tipo (void *)? riferimento alla What is the difference between new/delete and malloc/free? risposta - dice new returns a fully typed pointer while malloc void *

Ma secondo http://www.cplusplus.com/reference/new/operator%20new/

throwing (1)  
void* operator new (std::size_t size) throw (std::bad_alloc); 
nothrow (2) 
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) throw(); 
placement (3) 
void* operator new (std::size_t size, void* ptr) throw(); 

che significa che restituisce un puntatore di tipo (void *), se restituisce (void *) Non ho mai visto un codice come MyClass * ptr = (MyClass *) new MyClass;

Mi sono confuso.

EDIT

Come per esempio http://www.cplusplus.com/reference/new/operator%20new/

std::cout << "1: "; 
    MyClass * p1 = new MyClass; 
     // allocates memory by calling: operator new (sizeof(MyClass)) 
     // and then constructs an object at the newly allocated space 

    std::cout << "2: "; 
    MyClass * p2 = new (std::nothrow) MyClass; 
     // allocates memory by calling: operator new (sizeof(MyClass),std::nothrow) 
     // and then constructs an object at the newly allocated space 

Così MyClass * p1 = new MyClass chiamate operator new (sizeof(MyClass)) e dal momento throwing (1)
void* operator new (std::size_t size) throw (std::bad_alloc);
deve restituire (void *) se ho capito bene la sintassi.

Grazie

+2

[Plug Shameless] (http://stackoverflow.com/a/8962536/775806) –

+1

[voce cppreference per new-expression] (http://en.cppreference.com/w/cpp/language/new) – dyp

+0

@DyP Ok .. capito ... cosa intendevi dire? La nuova espressione (new int) usa una funzione di allocazione (operatore nuovo). La funzione di allocazione fornisce solo lo storage, new-expression new type-id restituisce un puntatore a type-id (o throw) '.. Grazie allo standard –

risposta

14

Stai confondendo operator new (che tornare void*) e il new operatore (che restituisce un puntatore completamente digitato).

void* vptr = operator new(10); // allocates 10 bytes 
int* iptr = new int(10); // allocate 1 int, and initializes it to 10 
+1

si riferisce a quest'ultimo come * new-expression *. – LihO

+0

Un modo di pensarci è che l'espressione 'new'" converte "o" lancia "la memoria negli oggetti: il puntatore void entra, il puntatore dell'oggetto viene fuori. –

+0

john Riferendosi a http://www.cplusplus.com/reference/new/operator%20new/ 'std :: cout <<" 1: "; MyClass * p1 = new MyClass; // alloca la memoria chiamando: operator new (sizeof (MyClass)) // e quindi costruisce un oggetto nello spazio appena allocato' chiama 'operator new (sizeof (MyClass))', quindi in pratica dovrebbe restituire ' (void *) 'come da argomento –

0

void * non ha bisogno di essere gettato in un tipo più elevato durante l'assegnazione solo vecchio codice C da prima dell'esistenza di void * richiede colata come la vecchia firma malloc restituito un char * invece.

0

new restituirà un puntatore di qualsiasi tipo di istanza. operator new restituisce il puntatore a void. new è abbastanza comune mentre operator new è un po 'più unico.