В настоящее время я использую некоторые функции из библиотеки glib. С glib также появляется gio. glib - это библиотека C, поэтому мне нужно удалить некоторые структуры, которые я создаю.
для многих объектов я создаю smartpointer, например:
std::shared_ptr<GAsyncQueue> my_queue = std::shared_ptr<GAsyncQueue>(g_async_queue_create(), g_async_queue_unref);
Для этого создается общий указатель на GAsyncQueue
, и это безопасно уничтожает очередь в конце ее жизни.
Однако я сталкиваюсь с проблемой, когда получаю указатель из библиотеки gio, который я не должен освобождать. В следующем коде my_connection
есть GSocketClient, который реализует (в glib-talk) GIOStream.
std::shared_ptr<GInputStream> my_input_stream =
std::shared_ptr<GInputStream> (
g_io_stream_get_input_stream(G_IO_STREAM(my_connection.get()))
);
Поскольку в документации по GIOStream упоминается, что указатель, полученный с помощью g_io_stream_get_input_stream()
, не должен быть освобожден. Это связано с тем, что он принадлежит экземпляру my_connection
.
Я думал о создании lamda для объекта destroy, второго параметра объекта общего указателя. например auto deleter = [](GInputStream* ptr) {};
, а затем дать эту лямбду как функцию detroy для общего указателя, но это кажется глупым.