Me he estado enseñando a mí mismo los punteros inteligentes que son parte de C++ 0x y encontré algo que me parece incongruente. Específicamente, cómo se manejan las políticas de destrucción de unique_ptr <> y shared_ptr <>.unique_ptr <> v shared_ptr <> en lo que respecta a la política de destrucción
Para unique_ptr <>, puede especializar std :: default_delete <> y, a partir de ese momento, a menos que solicite explícitamente una política de destrucción diferente, se utilizará la nueva configuración predeterminada.
considerar lo siguiente:
struct some_c_type;
some_c_type *construct_some_c_type();
void destruct_some_c_type(some_c_type *);
namespace std {
template <> struct default_delete<some_c_type> {
void operator()(some_c_type *ptr) {
destruct_some_c_type(ptr);
}
};
}
Ahora, una vez que esté en su lugar, unique_ptr <> va a utilizar la política de destrucción apropiada de manera predeterminada:
// Because of the specialization, this will use destruct_some_c_type
std::unique_ptr<some_c_type> var(construct_some_c_type());
Ahora compare esto a shared_ptr <>. Con shared_ptr <>, tiene que solicitar explícitamente la política adecuada destrucción o el valor predeterminado es utilizar el operador delete:
// error, will use operator delete
std::shared_ptr<some_c_type> var(construct_some_c_type());
// correct, must explicitly request the destruction policy
std::shared_ptr<some_c_type> var(construct_some_c_type(),
std::default_delete<some_c_type>());
dos preguntas.
- ¿Es correcto que shared_ptr <> requiere que se especifique la política de destrucción cada vez que se usa o me falta algo?
- Si no me falta algo, ¿alguna idea de por qué los dos son diferentes?
P.S. La razón por la que me importa esto es que mi compañía hace mucha programación mixta en C y C++. El código de C++ a menudo necesita usar objetos de estilo C, por lo que la facilidad de especificar una política de destrucción predeterminada diferente es bastante importante para mí.
¿Se supone que es 'std :: default_delete()'? Y en una nota al margen, a menos que esté arreglado en C++ 0x y estoy a punto de descubrirlo, los tres son molestos. –
GManNickG
@GMan - gracias, eso fue un error tipográfico. ¿Por qué los considera molestos (personalmente, considero que unique_ptr <> es un diseño bastante limpio)? –
@RSamuel: Quise decir el análisis molesto; en C++ 03, todas son declaraciones de funciones. – GManNickG