Usando unique_ptr con un deleter personalizado para GError
El uso de unique_ptr con un deleter personalizado para funciones en C que devuelven un puntero es bastante sencillo, pero ¿cómo lo usaría para funciones que toman un puntero a un puntero como parámetro (como GError)?
Me he enfrentado a esto en un par de casos, pero no encontré una manera directa de hacerlo. ¿Me estoy perdiendo algo?
using Element = std::unique_ptr<gstelement, void="" (*)(gstelement*)="">;
using Error = std::unique_ptr<gerror, void="" (*)(gerror*)="">;
...
GError* plain_err;
Element pipeline(gst_parse_launch(str, &plain_err), object_unref); // ok
Error uniq_err {nullptr, error_free};
Element pipeline(gst_parse_launch(str, uniq_err.get()), object_unref); // error: se requiere un lvalue como operando unario '&'
La única forma en que se me ocurre es asignarlo más tarde
cpp
</gerror,></gstelement,>
GError* plain_err;
Element pipeline(gst_parse_launch(str, &plain_err), object_unref);
Error uniq_err {plain_err, error_free};
plain_err = nullptr;
davy.ai
El uso de
unique_ptr
con un deletreador personalizado para las funciones de C que devuelven un puntero es de hecho sencillo. Sin embargo, al tratar con funciones que toman un puntero a un puntero como parámetro, comoGError
, puede que no haya una forma sencilla de usarunique_ptr
.En el fragmento de código proporcionado, intentar usar
unique_ptr
conGError
como parámetro pasado por referencia a través deget()
resulta en un error debido a un requisito de lvalue.Una posible solución alternativa es asignar el puntero a un puntero regular y luego utilizarlo para inicializar el
unique_ptr
más tarde. En otras palabras, primero debemos asignar el punteroGError
a un puntero regular, lanzar el pipelineGstElement
y luego pasar el puntero regular alunique_ptr
como argumento del eliminador.De esta manera, podemos utilizar
unique_ptr
para gestionar el ciclo de vida del objetoGError
.