大まかに次のように構成された大規模なレガシーアプリケーションを継承しました。
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
};
一度作成されたすべてのマネージャーは、アプリケーションの存続期間全体にわたってそこにとどまります。アプリケーションにはcloseまたはshutdownメソッドがなく、マネージャーにもそれらがありません。したがって、複雑な相互依存関係は処理されません。
問題は、オブジェクトの存続期間がアプリケーションの存続期間と緊密に結合している場合、クリーンアップをまったく行わないことは受け入れられている慣行ですか?オペレーティングシステム(この場合はWindows)は、プロセスが終了すると(タスクマネージャーで終了するか、ExitProcess、Abort、等。)?上記のアプローチで考えられる問題は何ですか?
または、より一般的な質問:グローバルオブジェクト(mainの外部で宣言されている)にはデストラクタが絶対に必要ですか?