La différence est que, std::make_unique
renvoie un objet de type std::unique_ptr
et new
renvoie un pointeur sur l'objet créé. Pour les échecs d'allocation de mémoire, ils seront à la fois de lancer. Tenez-vous bien, il n'est pas simple. Lire plus loin.
Considère la fonction ci-dessous:
void func(ClassA* a, ClassB* b){
......
}
Lorsque vous effectuez un appel, comme func(new A(), new B())
; Le compilateur peut choisir d'évaluer les arguments de la fonction, de gauche à droite, ou dans n'importe quel ordre il le souhaite. Supposons gauche à droite de l'évaluation: Ce qui se passe lors de la première new
expression réussit, mais le deuxième new
expression jette?
Le réel danger est lorsque vous prenez une de ces exceptions; Oui, vous avez peut-être pris l'exception levée par new B()
, et de reprendre le cours normal de l'exécution, mais new A()
déjà réussi, et sa mémoire sera silencieusement fuite. Personne pour le nettoyer... * sanglots...
Mais avec make_unique
, vous ne pouvez pas avoir une fuite parce que, le déroulement de pile qui va se passer ( et le destructeur de l'objet créé précédemment sera exécuté). Par conséquent, avoir une préférence pour l' make_unique
provoquera vous à l'égard de l'exception de sécurité. Dans ce cas, std::make_unique
fournit une "Base de l'Exception de Sécurité" que la mémoire allouée et l'objet créé par l' new
ne sera jamais orphelins n'importe quoi. Même jusqu'aux extrémités de temps... :-)
Vous devriez lire Herb Sutter GoTW102