2011-04-15 10 views
7

no veo cómo conseguir scoped_ptr o scoped_array utilizar un Deleter personalizado. Tal vez hay otra implementación que permite la eliminación controlada similar a shared_ptr?Boost scoped_ptr/scoped_array con Deleter encargo

Por cierto, ¿por qué shared_ptr permiten Deleter costumbre pero scoped_ptr no? Sólo curioso.

Respuesta

5

no veo cómo conseguir scoped_ptrscoped_array o de usar Deleter encargo

No se puede.

Tal vez haya otra implementación que permita una eliminación controlada similar a shared_ptr?

Si su compilador soporta referencias rvalue y su aplicación biblioteca estándar implementa std::unique_ptr, puede utilizar eso.

De lo contrario, la implementación boost::scoped_ptr es muy sencilla. The latest version es menos de 100 líneas de código simple. Sería bastante simple crear su propia derivada que tenga un eliminador personalizado (ya sea un parámetro estático a través de una plantilla o dinámico a través de una función o un funtor proporcionados en tiempo de ejecución).

+2

scoped_ptr es simple, pero habilitar la eliminación controlada no será tan sencillo. No es tan complejo como shared_ptr, pero aún así preferiría no codificarlo si hay una solución de biblioteca disponible. – pic11

1

Otra aplicación del puntero de ámbito y la matriz de ámbito se encuentra en Qt

http://doc.qt.io/qt-5/qscopedpointer.html

Permite Deleter personalizado.

+0

Los diferentes modificadores personalizados crean diferentes tipos de apuntadores, pero la implementación debe ser más simple que usar delegados genéricos. – pic11

+0

No conozco otra implementación que sea más simple. ¿Te gustaría dar uno? –

+0

Quería decir que la implementación de QT debería ser más simple que usar delegados genéricos como boost :: function. El rendimiento debería ser mejor también. Pero terminas con diferentes tipos de punteros para cada tipo de deletor diferente (el parámetro deleteter es template) – pic11

3

scoped_ptr no permite el borrado personalizado. La razón principal que puedo suponer es que su 'tamaño no será igual a sizeof(T*) si conservara boost::function<> como shared_ptr.

Creo que las opciones más portátiles son usar shared_ptr o escribir su propio scoped_ptr que admitirá los eliminadores.

+0

+1 para mencionar boost :: function <>. – pic11

+3

unique_ptr permite un eliminador personalizado, y si ese eliminador personalizado es una clase "vacía" (como es el eliminador predeterminado), entonces sizeof (unique_ptr) == sizeof (T *). –

3

Puede sobrecargar la función boost :: checked_delete, p.

namespace boost { 

template<> 
void checked_delete (Foo* x) 
{ 
    .... 
} 

} // namespace boost 

Después de la sobrecarga, scoped_ptr llamará a checked_delete en lugar de eliminar.