私は C# から来て、私の実践のいくつかを C++ に翻訳しようとしています。生のポインターを使用して、コード全体のさまざまな場所で依存性注入を使用しました。次に、生のポインターを std::shared_ptr のものに置き換えることにしました。そのプロセスの一環として、自動変数を動的に割り当てるのではなく、スタックに割り当てられた自動変数を使用することを検討することが提案されました (この質問を参照してください。その質問は unique_ptr のコンテキストにあったため、異なる可能性があります)。
以下の例は、自動変数の使用を示していると思います。
class MyClass
{
public:
MyClass(ApplicationService& app): appService_(app)
{
}
~MyClass()
{
appService_.Destroy(something);
}
private:
ApplicationService& appService_;
}
class ConsumerClass
{
DoSomething()
{
CustomApplicationService customAppService;
MyClass myclass(customAppService);
myclass...
}
}
上記の例で、customAppservice と myclass が範囲外になった場合、どちらが最初に破棄されるかをどうやって知ることができますか? customAppService が最初に破棄された場合、MyClass デストラクタは失敗します。これは、このシナリオで代わりに shared_ptr を使用する正当な理由ですか、それともこれを回避するクリーンな方法はありますか?
アップデート
ApplicationService は、コードが使用するサードパーティ ライブラリと対話するために必要なグローバル関数のラッパーであるクラスです。単体テストと独立した関数のスタブ/モックをサポートする標準的な方法であると信じているため、このクラスがあります。このクラスは、対応するグローバル関数への呼び出しを委任するだけです。呼び出し appService_.Destroy(something); MyClass の特定のインスタンスごとに使用されるオブジェクトを実際に破棄していますが、Application クラス自体とは何の関係もありません。