Frage

Meine Frage ist, wie fehlgeschlagen das folgende Code-Snippet ist, der Teil meines Ressourcenmanagers ist:

 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;

Da Shared_ptr von Passing Boost durch Referenz tatsächlich nicht Teil des Shared_Ptr -Konzepts ist, könnte ich in diesem Bereich nur in Schwierigkeiten geraten, wenn ich es nur in diesem Bereich verwende?

War es hilfreich?

Lösung

Diese Verwendung ist sicher, was auch immer die shared_ptr<> Durch die Referenz übergeben wird der RefCount reduziert (vorausgesetzt, dass die shared_ptr<> zurückgekehrt von seeker->second->Copy() ist nicht a shared_ptr<> auf dasselbe Objekt) und damit das Objekt, auf das es hinweist, könnte gelöscht werden.

Insbesondere erstellen Sie keine Sekunde shared_ptr<> von einem rohen Zeiger (was ein Fehler ist shared_ptr<> mit einem separaten RefCount und damit einem zweiten Eigentümer des Objekts).

Ob Ihre Funktion das gewünschte Verhalten bietet, hängt von dem ab, was Sie wollen.

Andere Tipps

Ich denke du willst so etwas tun:

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

In diesem Fall sollte es Ihnen gut gehen.

Sie müssen jedoch hier keine Referenz verwenden. Einfach zurückkehren a shared_ptr und setzen Sie es auf 0, wenn kein Element gefunden wurde:

 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;
 }

Ich bemerkte jedoch, dass Sie es verwenden scoped_ptr In einem Standardbehälter - welches Afaik nicht möglich ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top