アプリケーションで最長の寿命を持つオブジェクトを構築するファクトリがあります。これらには、 (多くの可能な実装を持つ抽象クラス)に依存する型、たとえば、ClientA
およびがあるため、両方のクライアントは、メンバーとして Provider への参照を持ちます。ClientB
Provider
コマンドライン引数に従って、ファクトリは の 1 つの実装を選択しProvider
、それを (" new
" で) 構築し、両方のクライアントのコンストラクタに渡します。
ファクトリは、アプリ全体を表すオブジェクトを返します。私の主な機能は基本的にこれです:
int main(int argc, char** argv)
{
AppFactory factory(argc, argv);
App app = factory.buildApp();
return app.run();
}
そして、そのbuildApp
方法は基本的に次のとおりです。
App AppFactory::buildApp()
{
Provider* provider = NULL;
if (some condition)
{
provider = new ProviderX();
}
else
{
provider = new ProviderY();
}
ClientA clientA(*provider);
ClientB clientB(*provider);
App app(clientA, clientB);
return app;
}
そのため、実行が終了すると、プロバイダ オブジェクトを除くすべてのオブジェクトのデストラクタが呼び出されます (" new
" で構築されたため)。
この設計を改善して、プロバイダーのデストラクタが確実に呼び出されるようにするにはどうすればよいですか?
編集:明確にするために、私の意図は、クライアント、プロバイダー、および App オブジェクトの両方が同じ寿命を共有することです。すべての回答の後、クライアントとプロバイダーの両方をヒープに割り当てて、 App オブジェクトに渡された参照を割り当てる必要があると思います。これは、死んだときにそれらを削除する責任があります。あなたは何を言っていますか?