xcb内存管理:我应该释放迭代器中的数据字段吗



xcb中有一组函数用于对某个列表属性进行迭代。它们都以iterator结束。例如,xcb_setup_roots_iterator。并且有相应的以next或其他结尾的函数用于迭代。

问题来了:当我不再需要数据时,我应该在迭代器的data字段上调用free吗?

这是一个样品。

int screen_num;
xcb_connection_t *connection = xcb_connect(NULL, &screen_num);
const xcb_setup_t *setup = xcb_get_setup(connection);
xcb_screen_iterator_t iter = xcb_setup_roots_iterator(setup);
for (; iter.rem; xcb_screen_next(&iter)) {
xcb_screen_t *screen = iter.data;
/*do something with screen*/
}
/*should I free iter.data here?*/

我知道iter在堆栈中,所以它会自动销毁。但里面的data呢?在我的想法中,xcb创建了它,在使用它之后,我再也不会把它传给xcb,所以xcb没有机会释放它,我应该手动释放它,以避免内存泄漏。

在搜索了文档和网页后,我只找到了一些关于内存管理的有限信息,例如:我应该始终释放xcb_wait_for_event的返回值。其他地方呢?xcb中内存管理的一般原理是什么?

短版本:不,你不应该释放它。

长版本:以下是xcb_screen_next:的实现

void
xcb_screen_next (xcb_screen_iterator_t *i)
{
xcb_screen_t *R = i->data;
xcb_generic_iterator_t child;
child.data = (xcb_screen_t *)(((char *)R) + xcb_screen_sizeof(R));
i->index = (char *) child.data - (char *) i->data;
--i->rem;
i->data = (xcb_screen_t *) child.data;
}

正如您所看到的,这只会产生一些指针魔法来计算屏幕的大小,然后将指针增加该量,即新的data成员点刚好超出最后一个屏幕的末尾。换句话说:在内存中,所有屏幕都在一个大的分配中。

我应该始终释放xcb_wait_for_event的返回值。其他地方呢?xcb中内存管理的一般原理是什么?

xcb实际上并不进行任何解析。相反,它将在线协议描述为structs,并提供了一些使用这些协议的方便方法。这意味着单个X11〃;数据包";从连接中读取并放入一个大的存储区域中。其他一切都只是进入各个领域的指针魔法。

既然你在问xcb_screen_t:这是xcb_setup_t的一部分。当连接到X11服务器时,会接收到单个xcb_setup_t。这被放在一个大的分配中,您可以使用xcb_get_setup访问它。此内存归libxcb所有,并由xcb_disconnect()释放。

还有什么是";数据包";?每个回复、事件和错误都是一个数据包。因此,您必须释放从xcb_wait_for_event()获得的任何内容,但也必须释放xcb_*_reply()。没有其他东西需要释放。

最新更新