3

クラスのデータ メンバーの割り当てに使用しない場合newでも、デストラクタで行う必要があるクリーンアップはありますか? たとえば、次の場合、deleteベクトルを指定する必要がありますか? それとも依存していMyTypeますか?

class A {
  A();
  ~A();
  MyType x;
  std::vector<MyType> v;
};
A::A() {
  x = MyType(42);
  v = std::vector<MyType>(5);
}
A::~A() {
  // what goes here?
}
4

6 に答える 6

9

衒学者であるためには、それは何であるかに依存MyTypeします。typedef char* MyTypeにメモリを割り当てMyType、そのメモリをオブジェクトが所有するようにしたい場合は、そうです。デストラクタが必要です。

newそれ以外の場合は、またはで割り当てられていないもののためにメモリを解放する必要はないmallocので、いいえ。

クラスにデストラクタを含めるべきではありません。実際に必要な場合にのみデストラクタを使用する必要があるという一般的なコンセンサスがあります。デストラクタがあるということは、代入演算子とコピーコンストラクタを実装することも意味します(3のルール)。メモリを管理していない場合は、コンパイラによって提供されるメモリに依存することをお勧めします。つまり、そうでない場合、コンパイラはこれら3つを生成します。

また、コンストラクターは次のようになります。

A::A() : x(42), v(5){
}

そうしないと、メンバーが初期化されてから割り当てられ、無駄になります。

于 2012-06-13T19:05:46.833 に答える
4

クラスには明示的なデストラクタは必要ありません。とにかく、のvectorデストラクタは自動的に呼び出されます。また、(内部のデータではなく)ベクトルオブジェクト自体は動的ではないため、動的にする必要はありませんdelete。実際、vポインタではないので、これは構文エラーになります。

于 2012-06-13T19:03:50.870 に答える
1

デストラクタは自動的に呼び出されるため、それを行う必要はありません。また、ポインターについては、手動で ing する代わりに、スマート ポインター( など) を使用します。std::unique_ptrdelete

class A {
  A();
  ~A();
  MyType x;
  std::vector<MyType> v;
};
A::A() : x(42), v(5) { }
A::~A() {
  // x.~MyType() implicitly called.
  // v.~std::vector<MyType>() implicitly called.
}
于 2012-06-13T19:03:38.223 に答える
1

ベクターは破壊時に自動的に削除されます。ただし、ポインターをベクターに格納する場合、たとえば vector<Foo *> v; と言う場合、ベクター内のポインターを削除するコードを記述する必要があります。これを回避する 1 つの方法は、vector<std::unique_ptr<Foo>> または vector<std::shared_ptr<Foo>> を使用することです。

于 2012-06-13T19:06:08.020 に答える
0

いいえ、する必要はありません。それらのコンストラクターは暗黙的に呼び出されます。

于 2012-06-13T19:04:16.987 に答える
0

クラスAの場合、 newまたはmallocを使用して割り当てられたポインター メンバーがないため、必要ありません。

クラス/構造体MyTypeにメンバーとしてポインタがある場合、 MyTypeのデストラクタはそのようなポインタのメモリを解放する責任があることに注意してください。ただし、デストラクタが呼び出されたときから、クラスAでそれを心配する必要はありません、ベクトルのデストラクタはMyTypeのデストラクタを呼び出します。

于 2012-06-13T19:11:55.917 に答える