在使用 GLib 的 C++ 程序中,使用 non-POD 是安全的。具有 Asynchronous Queue 的对象?
基本上,非 POD 对象将作为 gpointer 数据
传递到
void
g_async_queue_push (GAsyncQueue *queue,
gpointer data);
然后用
检索gpointer
g_async_queue_pop (GAsyncQueue *queue);
理论上,这永远不会导致问题,因为 gpointer
只是 void*
的 typedef
,因此不要传递分配的 POD 对象g_new
并通过 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 来验证这一点.
关于c++ - 具有非 POD 对象的 GLib 异步队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52167647/