Ale*_*104 1 c++ destructor scope
我想我的问题很愚蠢,但尽管如此:
在我的 C++ 代码中,我使用一些遗留的 C 库(XLib)。为了使用这个库,必须首先打开到 X 服务器的连接:
::Display* const display = ::XOpenDisplay(nullptr);
Run Code Online (Sandbox Code Playgroud)
这种display结构广泛用于绝大多数 XLib 函数,包括分配和释放内存和系统资源(如字体、颜色图等)的函数。在我的代码中,我使用对象的构造函数和析构函数通过调用这些函数来分配和释放资源功能。问题是这样的:
int main()
{
::Display* const display = ::XOpenDisplay(nullptr);
// ...
Object1 object1(display, ...); // uses display inside the destructor
Object2 object2(display, ...); // uses display inside the destructor
Object3 object3(display, ...); // uses display inside the destructor
// ...
::XCloseDisplay(display); // invalidates the display structure
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此示例会导致分段错误,因为在调用任何使用该结构的析构函数之前该display结构已失效。XCloseDisplay()为了避免这个问题,我可以将之前的所有代码放在XCloseDisplay()大括号中以限制对象的范围,但这会使代码向右移动,这看起来非常难看。
有什么办法可以XCloseDisplay()在之后打电话main()吗?
这是可能的,但没有必要。
相反,将其包装在一个类中,并在析构函数中将其关闭,就像对其他对象所做的那样。
析构函数以相反的顺序调用,这意味着如果您先创建显示,它将最后消失。
类似地,您之后调用它的方式main是从全局或函数局部static对象的析构函数中调用它。函数局部静态比全局变量更好,因为它避免了静态初始化顺序的惨败。