Obecnie używam niektórych funkcji z biblioteki glib. Z glibem przychodzi również gio. glib jest biblioteką C i dlatego muszę usunąć niektóre struktury, które tworzę.Jak używać shared_ptr ze wskaźnikiem do struct, który nie powinien zostać zwolniony
dla wielu obiektów tworzę sprytny wskaźnik np
std::shared_ptr<GAsyncQueue> my_queue = std::shared_ptr<GAsyncQueue>(g_async_queue_create(), g_async_queue_unref);
W tym celu tworzy wspólny wskaźnik do GAsyncQueue
i jest bezpiecznie niszczy kolejkę na jego koniec jego życia.
Jednak pojawia się problem, gdy otrzymam wskaźnik z biblioteki gio, którego nie powinienem zwolnić. W poniższym kodzie my_connection
jest GSocketClient, który implementuje (w glib speak) GIOStream.
std::shared_ptr<GInputStream> my_input_stream =
std::shared_ptr<GInputStream> (
g_io_stream_get_input_stream(G_IO_STREAM(my_connection.get()))
);
Ponieważ dokumentacja GIOStream wspomina, że wskaźnik uzyskano g_io_stream_get_input_stream()
nie powinna być zwolniona. Jest tak dlatego, że jest własnością instancji my_connection
. Pomyślałem o stworzeniu lamdy dla obiektu zniszczonego, drugiego parametru obiektu współdzielonego wskaźnika. np. auto deleter = [](GInputStream* ptr) {};
, a następnie nadaj tej funkcji lambdę funkcję detrozy we współużytkowanej wskazówce, ale to wydaje się głupie.
Dlaczego warto używać wskaźnika (smart)? Czy odniesienie nie wystarczy? – edmz
@ black Wciąż trochę się nad tym zastanawiam. Strumień wejściowy jest instancją obiektu, który jest kopiowany. GIOStream ulega zniszczeniu po wywołaniu ostatniego destruktora kopii. Być może, ponieważ i tak nie muszę go zniszczyć, jest to prosta wskazówka również w porządku ... – hetepeperfan
I wskaźnik, który mogę ustawić na NULL, wtedy łatwiej jest sprawdzić, czy jest on zainicjalizowany. – hetepeperfan