2012-03-07 15 views
11

La definizione di nuovo nel < nuova> intestazione è:Perché new non richiede un cast al puntatore anche se Malloc lo richiede?

void* operator new(size_t); 

E la definizione di malloc è come detto:

void* malloc(size_t); 

Ora, come C++ è un linguaggio fortemente tipizzato, richiede un lanciato dal programmatore per convertire un puntatore void * nel tipo richiesto dal programmatore ... In malloc, dobbiamo eseguire un cast, ma non in un nuovo, anche se entrambi restituiscono un puntatore void *. Perché?

+0

controllo questo fuori http://www.codeproject.com/Articles/6555/To-new-is-C-To-malloc -is-C-To-mix-them-is-sin – pyCthon

+0

anche questo http://stackoverflow.com/questions/184537/in-what-cases-do-i-use-malloc-vs-new – pyCthon

+5

Guarda anche : http://stackoverflow.com/q/1885849/1155650 –

risposta

12

Perché quando si utilizza new, si utilizza (normalmente) una "nuova espressione", che alloca e inizializza un oggetto. Stai quindi assegnando l'indirizzo di tale oggetto a un puntatore a un oggetto dello stesso tipo (o genitore), che non richiede un cast. Una nuova espressione normale (vale a dire, non un nuovo inserimento) invocherà internamente operator new ma il risultato della nuova espressione è non solo il risultato da operator new.

Se si richiama direttamente operator new, è necessario eseguire il cast del risultato per assegnare il valore restituito a un puntatore non vuoto, proprio come si ha a che fare con il ritorno da malloc.

+1

Puoi dirmi di più sulla nuova espressione ???? – bhuwansahni

+2

La risposta accettata [e brillante :-)] alla domanda a cui @Rohit ha collegato entra più in dettaglio in merito. –

5

Perché hai l'impressione sbagliata su come usare malloc. Non riceve il tipo come argomento ma solo la dimensione del tipo.

C e C++ sono lingue diverse. In C non è necessario eseguire il cast di void* di malloc nel tipo di puntatore di destinazione. In C++ l'operatore new è profondamente integrato nel linguaggio in modo tale da restituire sempre un valore corrispondente al tipo specificato nell'argomento.

La regola è abbastanza semplice: utilizzare new per C++ e malloc per C, non mescolarli.

+0

In che modo il nuovo riceve il tipo come argomento ?? – bhuwansahni

+1

@bhuwansahni, 'new' è un operatore non una funzione. Nel posto in cui lo usi, dai sempre il tipo di oggetto che deve essere assegnato e costruito. Spetta al compilatore creare il collegamento. In C per una chiamata a 'malloc', dai solo la dimensione. –

+0

sì ma la dichiarazione del nuovo operatore non lo riflette, perché ??? – bhuwansahni

1

Poiché la chiamata operator new è solo un passaggio generato nell'intera catena quando si richiama new.

Quando si esegue s=new my_type(args);, il compilatore si espanderà che a:

s = (my_type*)my_type.operator new(sizeof(my_type)); 
s.my_type(args); //Constructor call 
Problemi correlati