Considérez les extraits de code suivants :
std::shared_ptr<Object> p1 = std::make_shared<Object>("foo"); std::shared_ptr<Object> p2(new Object("foo"));
Comprendre pourquoi make_shared est plus efficace que l'utilisation du constructeur shared_ptr nécessite directement un analyse étape par étape des opérations impliquées.
make_shared n'alloue de la mémoire qu'une seule fois, tandis que le shared_ptr initialisé par le constructeur alloue de la mémoire deux fois. Cela rend make_shared plus efficace.
En C 17, l'ordre d'évaluation des arguments de fonction a été révisé, éliminant un problème de sécurité des exceptions avec l'approche shared_ptr initialisée par le constructeur. Cependant, considérons l'exemple :
void F(const std::shared_ptr<Lhs> &lhs, const std::shared_ptr<Rhs> &rhs) { /* ... */ } F(std::shared_ptr<Lhs>(new Lhs("foo")), std::shared_ptr<Rhs>(new Rhs("bar")));
Si une exception est levée lors du constructeur Rhs, la mémoire allouée pour Lhs sera perdue car elle n'a pas été immédiatement transmise au constructeur shared_ptr. make_shared évite ce problème en éliminant cette étape intermédiaire.
Cependant, make_shared présente un inconvénient : puisqu'il alloue le bloc de contrôle et l'objet géré dans un seul bloc de tas, la mémoire pour les deux ne peuvent pas être désaffectés indépendamment. Cela signifie que des pointeurs faibles peuvent maintenir le bloc de contrôle en vie indéfiniment, empêchant potentiellement la désallocation du bloc de contrôle et de l'objet géré.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!