Pregunta

mi pregunta es, ¿cómo prueba de fallos es el siguiente fragmento de código que es parte de mi administrador de recursos:

 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;

debido a que pasa shared_ptr de impulso por referencia en realidad no es parte del concepto shared_ptr, si yo sólo lo uso en este ámbito, podría corro en problemas?

¿Fue útil?

Solución

Este uso es seguro, en que cualquiera que sea la shared_ptr<> pasó a través de la referencia tendrá su refcount reduce (suponiendo que el shared_ptr<> regresar de seeker->second->Copy() no es un shared_ptr<> al mismo objeto) y por lo tanto el objeto que estará apuntando a puede ser eliminado.

En concreto, no está creando un segundo shared_ptr<> desde un puntero sin formato (que es un error porque crearía un segundo, shared_ptr<> no relacionada con un refcount separado, y por lo tanto un segundo propietario del objeto).

Ya sea que su función proporciona el comportamiento que desea depende de lo que quiera.

Otros consejos

supongo que quiere hacer algo como esto:

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

En este caso, usted debe estar bien.

Sin embargo no es necesario utilizar una referencia aquí. Simplemente devuelve un shared_ptr y ponerlo a 0 si no se encontró ningún elemento:

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

Sin embargo, me di cuenta de que está utilizando scoped_ptr en un contenedor estándar -., Que yo sepa, no es posible

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top