2

私はC++とスマートポインタに不慣れです。私はこのようなコードを持っています。

Example* Example::get_instance() {
        Example* example = new Example();
        return example;
}

私はそれをこのようなスマートポインタに変換しようとしています

shared_ptr<Example> Example::get_instance() {
        shared_ptr<Example> example (new Example());
        return example;
}

別のクラスからこれを呼び出そうとすると機能しないため、これは正しい方法ですか。シングルトンオブジェクトを実装しようとしています。

4

1 に答える 1

1

Exampleオブジェクトが要求されるたびに新しいオブジェクトを作成しています。これはメモリリークであり、毎回異なるオブジェクトを返しています。代わりにこれを試してください:

Example & Example::get_instance() {
        static Example example;
        return example;
}

また、コードに関する次のアドバイスにも注意してください。

  • スマート ポインターを作成するときmake_sharedは、代わりにshared_ptr<YourType>(new YourType(...)). その理由はここにあります。関連する抜粋:

    この関数は通常、T オブジェクトと shared_ptr の制御ブロックに単一のメモリ割り当てでメモリを割り当てます (標準では拘束力のない要件です)。対照的に、宣言 std::shared_ptr p(new T(Args...)) は少なくとも 2 つのメモリ割り当てを実行するため、不要なオーバーヘッドが発生する可能性があります。さらに、f(shared_ptr(new int(42)), g()) は、g が例外をスローすると、メモリ リークを引き起こす可能性があります。make_shared を使用すると、この問題は発生しません。

  • と の違いを理解してstd::unique_ptrくださいstd::shared_ptr。あなたの場合、aのstd::unique_ptr方が良かったでしょうが、上で示した、あなたの問題に対するさらに簡単な解決策があります。

  • 一般に、代わりに参照を使用できる場合はポインターを避けてください。ポインターの方が使いやすく、コードが少しきれいに見えます。

  • 最後に、シングルトンが本当に必要ですか? 私はただ尋ねなければなりません。私はほぼ 4 年間、プログラマーとしてフルタイムで働いています。それほど長くはありませんが、オブジェクトへの参照を呼び出しチェーンに渡す代わりに、自分または他の誰かが Singleton パターンを使用したことを後悔する状況に遭遇するのに十分でした。

シングルトンを避けるようにしてください。シングルトンを使用するコードが、最終的にExampleExample::get_instance を呼び出す代わりに、オブジェクトの複数のインスタンスで動作し、その単一のインスタンスでのみ動作する可能性があることに気付く場合があります。したがって、その啓示が得られたとき (そしてそれは時間の問題かもしれません)、その前に大規模なリファクタリングが行われることになります。

だから、「気をつけて、ドラゴンがいる!」.

于 2013-03-18T05:39:24.540 に答える