【问题标题】:X11 resource freeing (in particular Screen objects)X11 资源释放(特别是 Screen 对象)
【发布时间】:2017-06-13 11:40:24
【问题描述】:

我目前正在从事一个偶尔需要直接使用 X11 函数的项目。来自一个所有内容都被广泛记录的 Windows 世界,我在查找和摸索相对稀疏的 linux 文档时遇到了一些麻烦。

例如,如果我有代码:

Display* disp;
if (!(disp = XOpenDisplay(NULL))) {
    return;
}

Window root = DefaultRootWindow(disp);
Screen* scr = XDefaultScreenOfDisplay(disp);

XCloseDisplay(disp);

我知道 XCloseDisplay 会清理 Window root,因为它会破坏所有窗口和资源 ID。

我不知道我是否需要按照示例手动从 XDefaultScreenOfDisplay 等 X 函数返回的 XFree Screen 对象。

关于这个案例的任何信息,甚至是关于何时使用 Xfree 的通用规则都会非常有帮助。

【问题讨论】:

    标签: c++ x11 xlib


    【解决方案1】:

    应用程序不应直接修改 Display 和 Screen 结构的任何部分。成员应该被认为是只读的,尽管它们可能会因显示器上的其他操作而改变。

    这意味着这些结构由 XLib 管理,不应该 freeXFree 他们。释放一个结构意味着它曾经占用的内存可以分配给其他数据并最终被覆盖。

    【讨论】:

    • 哈!就在第 9 页,哈哈。我不敢相信我没想到要搜索“屏幕结构”。
    • 但是,对于显示器,有 XCloseDisplay。所以我想知道是否有类似XCloseScreen.
    • 但可能并非如此,因为我在一个小型测试程序上运行了 valgrind,该程序通过 XDefaultScreen 获取了一个 Screen* 指针,并且 valgrind 报告没有泄漏。
    【解决方案2】:

    Raw X,就像 Windows SDK 一样,是一个 C 接口。

    大约有 7 个 X-Windows 手册,例如 http://shop.oreilly.com/product/9781565920026.do(Xlib 编程手册)和 https://www.oreilly.com/library/view/x-toolkit-intrinsics/9780937175620/(X 工具包内部编程手册)。这些都是自 1992 年以来一直存在的。与 Windows 一样,它们充满了示例。或者有互联网 - 只需输入命令,大部分页面都在线。

    手册页会告诉您命令是否需要释放。

    XDefaultScreenOfDisplay 的手册页没有提到释放,所以没有必要。

    如果您查看 XGetVisualInfo 的手册页,它会说您可以使用 XFree 释放返回的结构。

    【讨论】:

    • 我知道手册页没有明确提到它,但 Xlib 手册指出“您必须使用 XFree 来释放由 Xlib 分配的任何对象。”所以我想知道XDefaultScreenOfDisplay返回的Screen*是否已被函数调用分配,或者它本质上是Display*的静态成员。因此我的困惑。我想我会学会相信,如果手册页没有说要做某事,那是因为您不需要这样做,而不是因为维护人员希望您知道这样做。
    • 我遵循的理念是如果手册页没有告诉我释放,我就不释放。它似乎工作。这是典型的 Unix 哲学——它只会在出现错误或不同时抱怨或突出显示信息。如果没有任何问题或这是标准行为,它不会告诉您。
    • @cup 很遗憾,您的第二个链接已损坏。您是否可以添加一些关于您最初链接到哪本书的信息?
    • @PhilippLudwig 这是第4卷。我已经更新了答案
    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2012-01-08
    • 2012-05-04
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多