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