【发布时间】:2019-02-09 13:36:48
【问题描述】:
在使用 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 只是void* 的typedef,所以我可以传递分配给g_new 并释放g_free 的POD 对象,而不是传递分配给new 并由 delete 释放(使用适当的类型转换以避免 this)。这个实现隐藏在我的班级中,所以我是唯一控制队列的人。
然而,如果队列不得不在内部释放一个指针(例如,如果在 g_async_queue_unref 之后队列被销毁,而项目仍在排队),它将调用 g_free 以分配使用 new 的对象,即bad for many reasons。 documentation for GLib 通常表示将g_new() 与g_free() 和new 与delete 匹配很重要。
我知道应该避免这种 C++ 类型与 C 库的混合,但这种设计考虑超出了这个问题的范围。
【问题讨论】:
标签: c++ memory-management message-queue glib