В программе 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 следует избегать, но такого рода рассмотрение дизайна выходит за рамки этого вопроса.