1. ホーム
  2. c++

[解決済み] C++ ベクトル、ポインターを使ったデストラクタ。

2022-03-07 16:19:06

質問

私が知っている限りでは、私が以下の方法で作成したものはすべてデストラクタで破壊する必要があります。 new を開き、開いたファイルストリームや他のストリームを閉じます。 しかし、C++の他のオブジェクトについては、少し疑問があります。

  • std::vectorstd::string s: 自動的に破棄されるのですか?

  • のようなものがあった場合

    std::vector<myClass*> 
    
    

    クラスへのポインタの ベクターデストラクタが呼ばれるとどうなるか?
    のデストラクタを自動的に呼び出すのでしょうか? myClass ? それとも、ベクターだけが破壊されて、それが含むすべてのオブジェクトはまだメモリ内に存在するのでしょうか?

  • あるクラスの中に別のクラスへのポインタがある場合、例えばどうなるのでしょうか。

    class A {
      ClassB* B;
    }
    
    

    で、クラスAはコード内のある時点で破壊されます。クラスBも破壊されるのでしょうか、それともポインタだけで、クラスBはまだメモリのどこかに存在するのでしょうか?

解決方法は?

<ブロッククオート

std::vectorとstd::strings。これらは自動的に破棄されるのですか?

はい(メンバ変数がポインタでない場合 std::vectorstd::string ).

std::vector のようなものがある場合、vector のデストラクタが呼ばれるとどうなるのでしょうか? 自動的に myClass のデストラクタが呼ばれるのでしょうか?それとも、vector だけが破壊され、それを含むすべてのオブジェクトはまだメモリ内に存在するのでしょうか?

もし vector<MyClass> の場合、ベクターに含まれるすべてのオブジェクトが破壊されます。もし vector<MyClass*> の場合、すべてのオブジェクトは明示的に delete のオブジェクトを所有していると仮定します。 vector ). 第三の選択肢は vector のようなスマートポインタの vector<shared_ptr<MyClass>> この場合 vector を明示的に指定する必要はありません。 delete d.

クラスの中に別のクラスへのポインタがある場合はどうなりますか?

B は、明示的に delete d. ここでも、スマートポインタを使用して、破壊を処理することができます。 B .