在使用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 reasons。 documentation for GLib通常说,将g_free
与new
和g_new()
与g_free()
匹配非常重要。
我知道应该避免将C ++类型与C库混合使用,但是这种设计考虑不在此问题的范围内。
答案 0 :(得分:1)
只要创建GAsyncQueue
时未为元素指定可用功能(请参见g_async_queue_new_full()
),就可以保证不会释放或重新分配存储在其中的指针。就队列而言,它们是不透明的。
您可以通过查看the implementation进行验证。