Асинхронная очередь GLib с объектами, отличными от POD

В программе C++, использующей GLib, безопасно использовать не-POD. объекты с асинхронной очередью?

В основном объект не-POD будет передан как gpointer data в

void
g_async_queue_push (GAsyncQueue *queue,
                    gpointer data);

а затем получен с

gpointer
g_async_queue_pop (GAsyncQueue *queue);

Теоретически это никогда не должно вызывать проблем, потому что gpointer — это просто typedef для void*, поэтому вместо передачи объектов POD, выделенных с помощью g_new и освобожденных с помощью g_free, я мог передать объекты POD, выделенные с помощью new и освобожденные с помощью delete (с правильным приведением типов, чтобы избежать это). Эта реализация скрыта внутри моего класса, поэтому я единственный, кто контролирует очередь.

Однако, если очереди когда-либо придется внутренне освободить указатель (например, если после g_async_queue_unref очередь будет уничтожена с элементами, все еще находящимися в очереди), она вызовет g_free для объекта, выделенного с помощью new, а это плохо по многим причинам. В документации для GLib в целом говорится, что важно соответствовать g_new() с g_free() и new с delete.

Я знаю, что такого сочетания типов C++ с библиотекой C следует избегать, но такого рода рассмотрение дизайна выходит за рамки этого вопроса.


person lornova    schedule 04.09.2018    source источник


Ответы (1)


Пока вы создаете GAsyncQueue без указания свободной функции для элементов (см. new-full" rel="nofollow noreferrer">g_async_queue_new_full()), он гарантированно не освобождает и не перераспределяет хранящиеся в нем указатели. Они непрозрачны в отношении очереди.

Вы можете убедиться в этом, просмотрев реализация.

person Philip Withnall    schedule 05.09.2018
comment
Отличный ответ. Спасибо. - person lornova; 05.09.2018