Pregunta

Cuando tengo una clase que contiene punteros como variables miembro de qué tipo de puntero inteligente en caso de que tengan que si quiero no quieren utilizar punteros de civil? Ellos no necesitan ser compartidos (lo que no es necesario shared_ptr). scoped_ptr no funcionará ya que a menudo la necesidad de construir los objetos fuera de la lista de inicialización.

O es tal vez la práctica común utilizar un scoped_ptr durante la creación cuando algo todavía puede fallar (excepciones lanzadas etc.) y luego asignarlos a los punteros de civil?

¿Fue útil?

Solución

Si acaba de querer almacenar punteros miembros de una clase de tipo de puntero inteligente por lo que no puede / no se olvide de eliminarlos, a continuación, una opción estándar sería auto_ptr. Está en la STL y es fácilmente "reinicio" con la función reset() cuando se necesita para liberar la memoria actual asignada a él y sustituirlo por un nuevo objeto.

Usted todavía tendrá que implementar su propio constructor de copia y de los operadores de asignación para las clases que tienen auto_ptr miembros. Esto es debido al hecho de que las transferencias de operador de asignación auto_ptrs la propiedad del objeto subyacente por lo que un operador de asignación por defecto no tendrá el efecto deseado.

Esto es lo que la clase podría ser:

class X
{
public:
    X() :p(new ClassToManage) {}
    X(const X &copy)
        :p(new ClassToManage(*copy.p))
    {
    }

    X &operator=(const X &rhs)
    { 
        this->p.reset(new ClassToManage(*rhs.p));   
    }   

private:
    std::auto_ptr<ClassToManage> p;
};

Para todos los demás casos que sugeriría boost::shared_ptr. Shared_ptr hace el recuento de referencias, pero se puede almacenarlos en contenedores estándar que los hace muy útiles.

en última instancia, debe tratar de librarse de uso de punteros de civil para cualquier cosa que apunta a la memoria asignada es responsable de la eliminación. Si desea utilizar un puntero sin formato para acceder o interactuando sobre una matriz ole llano etc., entonces está bien (pero preguntarse por qué no se está usando un std :: vector), pero cuando los utiliza para apuntar a algo que es responsable de liberar entonces usted está pidiendo problemas. Mi objetivo al escribir código es no tener eliminaciones explícitas.

Otros consejos

Se puede usar std::auto_ptr, que estaba disponible antes de la TR1 y por lo tanto su código no depende de un compilador de soporte TR1-smartpointers.

Normalmente utilizo un deep_copy_ptr. En este momento no conozco Loki smart_ptr y AXTER puntero inteligente que hacer esto. Se permite la clase de puntero que va a copiar automáticamente un poco como si fuera una variable miembro normal (que no es necesario definir un operador especial de asignación / constructor de copia).

Creo que no tiene que inicializar específicamente en la lista de inicialización (pero al igual que un puntero normal, no lo use si no tiene un valor válido, obviamente).

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