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

问题描述 投票:1回答:1

在使用GLib的C ++程序中,使用带有non-PODAsynchronous Queue对象是安全的吗?

基本上非POD对象将作为gpointer data传递给

void
g_async_queue_push (GAsyncQueue *queue,
                    gpointer data);

然后检索

gpointer
g_async_queue_pop (GAsyncQueue *queue);

理论上这应该永远不会导致问题,因为gpointer只是typedefvoid*,所以我没有传递用g_new分配的POD对象并且用g_free释放,我可以传递用new分配并由delete释放的POD对象(使用适当的类型转换以避免this )。这个实现隐藏在我的类中,所以我是唯一一个控制队列的人。

但是,如果队列必须在内部释放一个指针(例如,如果在g_async_queue_unref之后队列被仍然排队的项目销毁),它将调用g_freenew分配的对象,即bad for many reasonsdocumentation for GLib一般说,将g_new()g_free()newdelete相匹配是很重要的。

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

c++ memory-management message-queue glib
1个回答
1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.