【问题标题】:GLib Asynchronous Queue with non-POD objects具有非 POD 对象的 GLib 异步队列
【发布时间】: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 reasonsdocumentation for GLib 通常表示将g_new()g_free()newdelete 匹配很重要。

我知道应该避免这种 C++ 类型与 C 库的混合,但这种设计考虑超出了这个问题的范围。

【问题讨论】:

    标签: c++ memory-management message-queue glib


    【解决方案1】:

    只要您创建 GAsyncQueue 时没有为元素指定空闲函数(请参阅 g_async_queue_new_full()),就可以保证不会释放或重新分配存储在其中的指针。就队列而言,它们是不透明的。

    您可以通过查看the implementation 来验证这一点。

    【讨论】:

    • 优秀的答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多