c++ - 具有非 POD 对象的 GLib 异步队列

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

在使用 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 reasonsdocumentation for GLib一般来说,将 g_new()g_free() 匹配,将 newdelete 匹配很重要。

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

最佳答案

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

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

关于c++ - 具有非 POD 对象的 GLib 异步队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52167647/

相关文章:

c++ - 进行少量插入时应该使用哪个 STL 容器?

c++ - 使用 unordered_map 时的内存分配

c - 我的程序需要能够处理SIGINT吗?

java - 大量(浮点)值的最佳数据结构

c - POSIX 消息队列 - 打开 : Invalid argument 时出错

c++ - C++ 中的继承不起作用。编译以下 C++ 代码时发生链接器错误

c++ - 错误 : unqualified ID

c++ - 英特尔 PIN 例程地址检索 : Linux vs. Windows

spring - apache camel 路由队列问题

ruby - Sinatra 消息队列