1. ホーム
  2. c++

[解決済み] C++ オブジェクトのインスタンス化

2022-09-04 18:09:53

質問

私はCプログラマで、C++を理解しようとしています。 多くのチュートリアルでは、次のようなスニペットを使用してオブジェクトのインスタンス化を実演しています。

Dog* sparky = new Dog();

というのは、後でやることを暗示しています。

delete sparky;

というようになり、理にかなっています。 さて、動的なメモリ確保が不要な場合、上記のような

Dog sparky;

で、sparkyがスコープ外に出たらデストラクタが呼ばれるようにする?

ありがとうございます。

どのように解決するのですか?

逆に、スタック確保を常に優先すべきです。経験則として、ユーザーコードで new/delete を使用しないようにすべきです。

おっしゃるとおり、変数がスタック上で宣言されると、そのデストラクタはスコープ外に出たときに自動的に呼び出され、リソースの寿命を追跡してリークを回避するための主要なツールになります。

ですから一般的に、リソースを割り当てる必要があるときはいつでも、それがメモリ (new を呼び出す)、ファイルハンドル、ソケット、その他何でも、コンストラクタがリソースを取得し、デストラクタがそれを解放するクラスでそれをラップします。そうすれば、スタック上にその型のオブジェクトを作成することができ、リソースがスコープ外に出たときに解放されることが保証されます。そうすれば、メモリリークを避けるために、あらゆる場所でnew/deleteのペアを追跡する必要がなくなります。

このイディオムの最も一般的な名称は RAII

また、専用のRAIIオブジェクトの外でnewで何かを割り当てる必要がある場合、稀に結果のポインタをラップするために使用されるスマートポインタクラスを調べてみてください。スマート ポインターは、たとえば参照カウントによってその寿命を追跡し、最後の参照がスコープ外に出たときにデストラクタを呼び出します。標準ライブラリには std::unique_ptr があり、単純なスコープベースの管理には std::shared_ptr で、これは共有オーナーシップを実装するために参照カウントを行います。

多くのチュートリアルでは、オブジェクトのインスタンス化を のようなスニペットを使用して、オブジェクトのインスタンス化を実演しています。

つまり、ほとんどのチュートリアルは最悪だということがわかったわけです。) ほとんどのチュートリアルは、必要のないときに変数を作成するために new/delete を呼び出したり、割り当てのライフタイムを追跡するのに苦労するなど、お粗末な C++ のプラクティスを教えます。