0

これは初めてで、オブジェクトの削除について簡単な質問をしたかっただけです。

MyClass1 というオブジェクトがあり、そこから MyClassA、MyClassB などの他の多くのクラスがあります。

MyClass1 でこれを行う必要があります。

MyClass1::~MyClass1()
{

delete MyClassA;
delete MyClassB;

}

または、MyClass1 を削除すると、MyClass1 で作成されたものはすべて自動的に削除されますか?

また、MyClassA と MyClassB でさらにオブジェクトを作成した場合、これらもそれぞれのクラスで手動で削除する必要がありますか?

ありがとう

4

5 に答える 5

4

あなたがこれを求めているのなら、あなたはただC ++を学んでいるだけなので、最善のアドバイスは-どちらでもない。このことについて知っておく必要があります(動的割り当てとメモリ管理-これについてはギヨームの回答を参照してください)が、実際に行うべきことRAII(google this)を使用することです。それを行う適切なC++の方法は次のとおりです。

struct  MyClass1
{
  MyClassA mA;
  std::shared_ptr<MyClassB> mB;

  MyClass1() : mB(new MyClassB)
  {

  }
};

見る?デストラクタはもう必要ありません。つまり、コピーコンストラクタやコピー代入演算子も必要ありません(ギヨームの答えに欠陥があります。最後の2つがありません)。

于 2013-01-01T21:02:30.087 に答える
3

delete演算子を使用してオブジェクトを作成した場合にのみ、演算子をnew呼び出します

struct  MyClass1
{
  MyClassA mA;
  MyClassB * mB;

  MyClass1()
  {
    mB = new MyClassB;
  }

  ~MyClass1()
  {
    delete mB;
  }
};
于 2013-01-01T20:56:27.607 に答える
1

の目的ではないため、ポインタではないオブジェクトを削除することはできませんdelete。これは、オブジェクトに関連付けられた動的メモリを解放することを目的としています。つまり、で作成されたものはすべてnew削除する必要があります。クラスへのポインタを持つことができ、それらを削除することができます。ただし、には何も割り当てられてnewいないため、を使用する必要はありませんdelete。実際、クラスは、作成されたスコープの最後でメモリから破棄されます。これらのオブジェクトは、動的メモリがヒープ上にあるときにスタックに割り当てられます。スタック上のオブジェクトには自動保存期間があります(宣言されている場合を除き、スコープの最後で削除されます。宣言さstaticれている場合は、「静的」保存期間があります。); さらに、ヒープ上のオブジェクトには動的な保存期間があります。C ++の動的メモリはあなたによって制御されます。それが私たちに与えられている理由ですnewdeleteC ++は私たち自身がメモリを処理することを期待しているため)。そうしないと、で構築されていないオブジェクトを削除することnewは未定義の動作であり、クラッシュにつながる可能性があります。

于 2013-01-01T21:10:34.607 に答える
0

Qtの場合は、QPointer!を使用します。これはスマートポインタです。デストラクタには何も必要ありません。

#include <QPointer>

class MyClass1
{
  QPointer<MyClassA> pA;
  QPointer<MyClassB> pB;
};
于 2013-01-01T23:05:17.327 に答える
0

deleteクラスではなく、オブジェクトに適用されます。原則として、オブジェクトを作成するために呼び出した場合にのみ、呼び出し (または、共有ポインターを介して、または一般的に RAII イディオムを使用して、自動的に呼び出されるように調整する) が必要です。例外は、(ライブラリの?) 呼び出しの戻り値がオブジェクトであり、(ライブラリの?) ドキュメントが、呼び出し元が破棄する必要があることを明示的に述べていることです(この場合、呼び出しを、持っているa の周りのラッパーと考えてください)。もちろん、そのような API は可能な限り避けるべきです。deletenewdeletenew

于 2013-01-01T21:34:22.847 に答える