Question

ma question est, comment fail-safe est l'extrait de code suivant qui fait partie de mon gestionnaire de ressources:

 bool Load(std::string name, boost::shared_ptr<Asset::Model>& newModel)
 {
  std::map<std::string, boost::scoped_ptr<Asset::Model> >::const_iterator seeker;

  seeker = models.find(name);
  if (seeker == models.end())
   return false;

  newModel = seeker->second->Copy(); // Copy returns a boost::shared_ptr<Asset::Model>
  return true;
 }

private:
 std::map< std::string, boost::scoped_ptr<Asset::Model> >  models;

parce que le passage de shared_ptr de boost par référence est en fait pas partie du concept shared_ptr, si je ne l'utilise que dans ce cadre, que je pourrais courir des ennuis?

Était-ce utile?

La solution

Cet usage est sûr, en ce sens quel que soit le shared_ptr<> passé à travers la référence aura son refcount réduit (en supposant que le shared_ptr<> retour de seeker->second->Copy() n'est pas un shared_ptr<> au même objet) et, par conséquent l'objet il pointer vers pourrait être supprimé.

, vous ne créez pas précisément une deuxième shared_ptr<> à partir d'un pointeur brut (ce qui est une erreur, car cela créerait une seconde, shared_ptr<> sans rapport avec un refcount séparé, et donc un deuxième propriétaire de l'objet).

Si votre fonction fournit le comportement que vous voulez dépend de ce que vous voulez.

Autres conseils

Je suppose que vous voulez faire quelque chose comme ceci:

boost::shared_ptr<Asset::Model> ptr;
if(Load("stuff", ptr))
{
     doSomething with ptr
}

Dans ce cas, vous devriez être bien.

Cependant, vous n'avez pas besoin d'utiliser une référence ici. Il suffit de retourner un shared_ptr et le mettre à 0 si aucun élément n'a été trouvé:

 boost::shared_ptr<Asset::Model> Load(std::string name)
 {
  std::map<std::string, boost::scoped_ptr<Asset::Model> >::const_iterator seeker;
  boost::shared_ptr<Asset::Model> retPtr;

  seeker = models.find(name);
  if (seeker == models.end())
   return retPtr;

  retPtr = seeker->second->Copy(); // Copy returns a boost::shared_ptr<Asset::Model>
  return retPtr;
 }

Cependant, je remarque que vous utilisez scoped_ptr dans un conteneur standard -. Qui est impossible AFAIK

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top