具有非POD对象的GLib异步队列

时间:2018-09-04 13:37:39

标签: c++ memory-management message-queue glib

在使用GLib的C ++程序中,可以将non-POD对象与Asynchronous Queue一起使用吗?

基本上,非POD对象将作为gpointer data传递给

void
g_async_queue_push (GAsyncQueue *queue,
                    gpointer data);

然后用

检索
gpointer
g_async_queue_pop (GAsyncQueue *queue);

从理论上讲,这永远不会造成问题,因为gpointer只是typedef的{​​{1}},因此,不要传递用void*分配并用{{ 1}}我可以传递分配给g_new并被g_free释放的POD对象(使用正确的类型转换来避免this)。该实现隐藏在我的类中,因此我是唯一控制队列的人。

但是,如果队列曾经必须在内部释放指针(例如,如果在new之后队列仍然被排队的项目销毁了),它将为delete分配的对象调用g_async_queue_unref 1}},即bad for many reasonsdocumentation for GLib通常说,将g_freenewg_new()g_free()匹配非常重要。

我知道应该避免将C ++类型与C库混合使用,但是这种设计考虑不在此问题的范围内。

1 个答案:

答案 0 :(得分:1)

只要创建GAsyncQueue时未为元素指定可用功能(请参见g_async_queue_new_full()),就可以保证不会释放或重新分配存储在其中的指针。就队列而言,它们是不透明的。

您可以通过查看the implementation进行验证。