Attualmente sto usando alcune funzioni dalla libreria di glib. Con glib arriva anche il gio. glib è una libreria C e quindi ho bisogno di cancellare alcune strutture che creo.Come utilizzare un shared_ptr con un puntatore a struct che non dovrebbe essere liberato
per molti degli oggetti che creo una smart pointer ad esempio:
std::shared_ptr<GAsyncQueue> my_queue = std::shared_ptr<GAsyncQueue>(g_async_queue_create(), g_async_queue_unref);
Per questo crea un puntatore condiviso a un GAsyncQueue
e questo è distrugge in modo sicuro la coda alla sua fine della sua vita.
Tuttavia, si verifica un problema quando ottengo un puntatore dalla libreria gio che non dovrei liberare. Nel seguente codice my_connection
è un GSocketClient che implementa (in un linguaggio parlante) GIOStream.
std::shared_ptr<GInputStream> my_input_stream =
std::shared_ptr<GInputStream> (
g_io_stream_get_input_stream(G_IO_STREAM(my_connection.get()))
);
Poiché la documentazione sul GIOStream menziona, che il puntatore ottenuto con g_io_stream_get_input_stream()
non deve essere liberato. Questo perché è di proprietà dell'istanza my_connection
. Ho pensato di creare una lamda per l'oggetto destroy, il secondo parametro di un oggetto pointer condiviso. es. auto deleter = [](GInputStream* ptr) {};
e poi dare quel lambda come funzione detroy al puntatore condiviso, ma questo sembra una specie di stupido.
Perché utilizzare un puntatore (intelligente)? Non sarebbe sufficiente una referenza? – edmz
@black ci sto ancora riflettendo. Il flusso di input è un'istanza di un oggetto che viene copiato. GIOStream viene distrutto quando viene chiamato l'ultimo distruttore di copia. Forse dal momento che non ho bisogno di distruggerlo comunque, è anche un semplice puntatore vecchio ... – hetepeperfan
E un puntatore posso impostare su NULL, quindi è più facile vedere se è inizializzato. – hetepeperfan