在使用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
的void*
,所以我没有传递用g_new
分配的POD对象并且用g_free
释放,我可以传递用new
分配并由delete
释放的POD对象(使用适当的类型转换以避免this )。这个实现隐藏在我的类中,所以我是唯一一个控制队列的人。
但是,如果队列必须在内部释放一个指针(例如,如果在g_async_queue_unref
之后队列被仍然排队的项目销毁),它将调用g_free
为new
分配的对象,即bad for many reasons。 documentation for GLib一般说,将g_new()
与g_free()
和new
与delete
相匹配是很重要的。
我知道应该避免使用C ++类型与C库的混合,但这种设计考虑因素超出了本问题的范围。
只要您创建GAsyncQueue
而不指定元素的自由函数(请参阅g_async_queue_new_full()
),就可以保证不释放或重新分配存储在其中的指针。就队列而言,它们是不透明的。
您可以通过查看the implementation来验证这一点。