[解決済み] C++のデストラクタはいつ呼ばれるのか?
質問
基本的な質問: C++で、プログラムがクラスのデストラクタメソッドを呼び出すのはどのようなときですか?私は、オブジェクトがスコープ外に出たときや、オブジェクトに
delete
より具体的な質問です。
1) オブジェクトがポインタを介して作成され、そのポインタが後で削除されたり、新しいアドレスを指し示すように与えられた場合、それが指し示すオブジェクトはそのデストラクタを呼び出しますか (他に何も指し示していないと仮定して)。
2) 質問1に続いて、オブジェクトがいつ範囲外になるか(オブジェクトが与えられた{block}を離れるときに関してではない)を定義するものは何でしょうか。つまり、いつリンクリスト内のオブジェクトのデストラクタが呼び出されるのでしょうか?
3) デストラクタを手動で呼び出したいと思うことはありますか?
どのように解決するのですか?
<ブロッククオート1) オブジェクトがポインタ経由で作成され、そのポインタが後で削除されたり、新しいアドレスを指定された場合、それが指していたオブジェクトはそのデストラクタを呼び出しますか (他に何も指していないと仮定して)。
ポインタの種類に依存します。たとえば、スマートポインタは、多くの場合、オブジェクトが削除されるとそのオブジェクトを削除します。普通のポインタはそうではありません。ポインタが別のオブジェクトを指すようにした場合も同様です。スマートポインタの中には、古いオブジェクトを破壊したり、参照がなくなったら破壊したりするものがあります。普通のポインタにはそのような賢さはありません。ただアドレスを保持しているだけで、具体的にそうすることで、指し示すオブジェクトに対して操作を行うことができるのです。
2) 質問1に続いて、オブジェクトがスコープから外れるとき(オブジェクトが与えられた{block}から出るときに関してではない)を定義するものは何ですか。つまり、リンクリスト内のオブジェクトでデストラクタが呼び出されるのはいつなのでしょうか?
それはリンクリストの実装次第です。一般的なコレクションは、破壊されるときに含まれるすべてのオブジェクトを破壊します。
ですから、ポインタのリンクリストは通常、ポインタを破棄しますが、ポインタが指すオブジェクトは破棄しません。(それは正しいかもしれません。それらは他のポインタによって参照されているかもしれません。) しかし、ポインタを含むために特別に設計されたリンクリストは、それ自身の破壊時にオブジェクトを削除するかもしれません。
スマートなポインターのリンクされたリストは、ポインターが削除されたときに自動的にオブジェクトを削除するか、または、それ以上の参照がない場合にそうすることができます。すべては、あなたが望むことを行うピースを選択すること次第です。
3) デストラクタを手動で呼び出したいと思うことはありますか?
もちろんです。1つの例として、オブジェクトを同じ型の別のオブジェクトに置き換えたいが、メモリを解放して再び割り当てたくはない場合です。古いオブジェクトをその場で破棄し、新しいオブジェクトをその場で構築することができます。(しかし、一般的にこれは悪い考えです)。
// pointer is destroyed because it goes out of scope,
// but not the object it pointed to. memory leak
if (1) {
Foo *myfoo = new Foo("foo");
}
// pointer is destroyed because it goes out of scope,
// object it points to is deleted. no memory leak
if(1) {
Foo *myfoo = new Foo("foo");
delete myfoo;
}
// no memory leak, object goes out of scope
if(1) {
Foo myfoo("foo");
}
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] Javaにデストラクタはありますか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] ベースの仮想デストラクタを明示的に呼び出す必要がありますか?
最新
-
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++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み】'std::cout'への未定義の参照