[解決済み] C++ オブジェクトのインスタンス化
質問
私は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++ のプラクティスを教えます。
関連
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み】C++でファクトリーメソッドパターンを正しく実装する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較