le “nouvel” opérateur en c ++, question de pointeur

Question idiote, mais chaque fois que vous appelez un nouveau, avez-vous toujours un pointeur?

SomeClass *person = new SomeClass(); 

Et est-ce parce que vous avez besoin d’un pointeur pour pointer sur ce nouvel espace de mémoire alloué à la personne variable SomeClass? Merci!

Si new termine avec succès, il renvoie toujours un pointeur (s’il échoue, une exception est levée et rien n’est renvoyé).

Le pointeur est sur l’object qui a été créé ou, dans le cas d’un tableau, un pointeur sur le premier élément du tableau.

Oui, toujours un pointeur. Même si vous voulez surcharger du nouveau , le type de retour doit être annulé * .
Et vous avez raison sur le but

new crée un object sur le tas et tout ce qu’il peut retourner est son adresse – un pointeur.

Oui. Si vous demandez pourquoi il ne renvoie pas de référence à la place, puisque les références sont plus agréables que les pointeurs, la réponse est un inheritance historique.

Lorsque C ++ était en développement, si la machine ne parvenait pas à obtenir de la mémoire pour l’object, un pointeur spécial NULL était renvoyé. Voici comment cela se fait en C:

 SomeClass *person; person = (SomeClass*) malloc( sizeof( SomeClass ) ); if ( person == NULL ) fprintf( stderr, "no more people allowed!" ); 

En C ++ standard, les erreurs sont renvoyées par exception à la place:

 try { SomeClass *person = new SomeClass; // do something } catch ( std::bad_alloc ) { std::cerr << "no more people!" << std::endl; } catch ( ... ) { // using exceptions allows for other errors // from inside SomeClass::SomeClass too } 

Vous pouvez toujours le faire à l'ancienne, avec nothrow :

 SomeClass *person = new( std::nothrow ) SomeClass; if ( person == NULL ) std::cerr << "no more people allowed!" << std::endl; 

Le résultat est, c'est parfaitement raisonnable et bon style:

 SomeClass &person = * new SomeClass; // don't need no stinkin pointers! 

La nouvelle expression renvoie un pointeur, mais vous pouvez l’utiliser avec les classes “pointeur intelligent” (par exemple, à partir de Boost ). Alors:

 boost :: shared_ptr  person (nouveau SomePerson);

Je dois également souligner que, bien que vous soyez peut-être habitué à utiliser les parenthèses si vous venez d’un arrière-plan Java, en C ++, les parenthèses ne sont pas nécessaires lorsque vous utilisez le constructeur par défaut. Ainsi, par exemple, on écrit habituellement le new T lors de la construction par défaut, mais on écrit le new T(param) , ou le new T(param1,...,paramN) lors de la construction d’un object en utilisant un constructeur autre que celui par défaut.

Oui c’est correct; on pourrait théoriquement écrire (new SomePerson) -> doSomething (), mais ce serait une fuite de mémoire; C ++ n’a pas de récupération de place, il est donc nécessaire de stocker le résultat de la nouvelle expression dans quelque chose (un pointeur ou un pointeur intelligent) afin qu’elle puisse être correctement désallouée.