我们继承了大型遗留应用程序,其结构大致如下:
class Application
{
Foo* m_foo;
Bar* m_bar;
Baz* m_baz;
public:
Foo* getFoo() { return m_foo; }
Bar* getBar() { return m_bar; }
Baz* getBaz() { return m_baz; }
void Init()
{
m_foo = new Foo();
m_bar = new Bar();
m_baz = new Baz();
// all of them are singletons, which can call each other
// whenever they please
// may have internal threads, open files, acquire
// network resources, etc.
SomeManager.Init(this);
SomeOtherManager.Init(this);
AnotherManager.Init(this);
SomeManagerWrapper.Init(this);
ManagerWrapperHelper.Init(this);
}
void Work()
{
SomeManagerWrapperHelperWhateverController.Start();
// it will never finish
}
// no destructor, no cleanup
};
曾经创建的所有管理器在整个应用程序生命周期内都将保留在那里。该应用程序没有关闭或关闭方法,管理器也没有这些方法。因此,永远不会处理复杂的相互依赖关系。
问题是:如果对象的生命周期与应用程序的生命周期紧密耦合,那么根本不进行清理是否可以接受?一旦进程结束(通过在任务管理器中结束或调用ExitProcess、Abort等特殊函数),操作系统(在我们的例子中是Windows)是否能够清理所有内容(杀死线程、关闭打开的文件句柄、套接字等)? ETC。)?上述方法可能存在哪些问题?
或更一般的问题:对于全局对象(在 main 之外声明),析构函数是绝对必要的吗?