1. ホーム
  2. c++

[解決済み] C++のデストラクタはいつ呼ばれるのか?

2022-07-11 08:49:05

質問

基本的な質問: 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");
}