具有非 POD 对象的 GLib 异步队列
GLib Asynchronous Queue with non-POD objects
在使用 GLib 的 C++ 程序中,使用 non-POD objects with an Asynchronous Queue?
是安全的
基本上,非 POD 对象将作为 gpointer data
传递给
void
g_async_queue_push (GAsyncQueue *queue,
gpointer data);
然后用
检索
gpointer
g_async_queue_pop (GAsyncQueue *queue);
理论上这永远不会引起问题,因为 gpointer
只是 void*
的 typedef
,所以不要传递用 g_new
分配并释放的 POD 对象g_free
我可以传递用 new
分配并由 delete
释放的 POD 对象(使用适当的类型转换以避免 this)。此实现隐藏在我的 class 中,因此我是唯一控制队列的人。
但是,如果队列必须在内部释放一个指针(例如,如果在 g_async_queue_unref
之后队列被销毁,而项目仍在排队),它将调用 g_free
分配给一个对象new
也就是 bad for many reasons. The documentation for GLib 一般说将 g_new()
与 g_free()
和 new
与 delete
匹配很重要。
我知道应该避免将 C++ 类型与 C 库混合使用,但这种设计考虑超出了这个问题的范围。
只要您在创建 GAsyncQueue
时没有为元素指定自由函数(请参阅 g_async_queue_new_full()
),就可以保证不会释放或重新分配存储在其中的指针。就队列而言,它们是不透明的。
您可以通过查看 the implementation 来验证这一点。
在使用 GLib 的 C++ 程序中,使用 non-POD objects with an Asynchronous Queue?
是安全的基本上,非 POD 对象将作为 gpointer data
传递给
void
g_async_queue_push (GAsyncQueue *queue,
gpointer data);
然后用
检索gpointer
g_async_queue_pop (GAsyncQueue *queue);
理论上这永远不会引起问题,因为 gpointer
只是 void*
的 typedef
,所以不要传递用 g_new
分配并释放的 POD 对象g_free
我可以传递用 new
分配并由 delete
释放的 POD 对象(使用适当的类型转换以避免 this)。此实现隐藏在我的 class 中,因此我是唯一控制队列的人。
但是,如果队列必须在内部释放一个指针(例如,如果在 g_async_queue_unref
之后队列被销毁,而项目仍在排队),它将调用 g_free
分配给一个对象new
也就是 bad for many reasons. The documentation for GLib 一般说将 g_new()
与 g_free()
和 new
与 delete
匹配很重要。
我知道应该避免将 C++ 类型与 C 库混合使用,但这种设计考虑超出了这个问题的范围。
只要您在创建 GAsyncQueue
时没有为元素指定自由函数(请参阅 g_async_queue_new_full()
),就可以保证不会释放或重新分配存储在其中的指针。就队列而言,它们是不透明的。
您可以通过查看 the implementation 来验证这一点。