GLib Асинхронная очередь с не POD-объектами - PullRequest
0 голосов
/ 04 сентября 2018

В программе на 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 (при правильном приведении типа, чтобы избежать this ). Эта реализация скрыта в моем классе, поэтому я единственный, кто контролирует очередь.

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

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

1 Ответ

0 голосов
/ 05 сентября 2018

Пока вы создаете GAsyncQueue без указания свободной функции для элементов (см. g_async_queue_new_full()), гарантированно не освободить или перераспределить хранящиеся в нем указатели. Они непрозрачны в отношении очереди.

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

...