es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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* plain_err;
Element pipeline(gst_parse_launch(str, &plain_err), object_unref);
Error uniq_err {plain_err, error_free};
plain_err = nullptr;
</gerror,></gstelement,>

Tags:  , ,

Answer

  1. Avatar for 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, como GError, puede que no haya una forma sencilla de usar unique_ptr.

    En el fragmento de código proporcionado, intentar usar unique_ptr con GError como parámetro pasado por referencia a través de get() 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 puntero GError a un puntero regular, lanzar el pipeline GstElement y luego pasar el puntero regular al unique_ptr como argumento del eliminador.

    GError* plain_err;
    Element pipeline(gst_parse_launch(str, &plain_err), object_unref);
    Error uniq_err {plain_err, error_free};
    plain_err = nullptr;
    

    De esta manera, podemos utilizar unique_ptr para gestionar el ciclo de vida del objeto GError.

Comments are closed.