-1

クラスがあり、それを削除したいです。クラス内には、さまざまな変数、文字列、ベクトルなどがあります。

別のクラスから呼び出すと:

delete myClass;

そして、新しい myClass を作成すると、変数がまだそこにあるように見えます。

内部の各変数を手動で削除する必要がありますか:

myClass::~myClass()
{
}

助けてくれてありがとう!

4

2 に答える 2

2

オブジェクトが破棄されると、そのオブジェクトのすべてのメンバーが破棄されます。例えば:

struct A
{
  int x;
  char y;
  float* z;
};

void foo()
{
  A* ap = new A{5, 6};
  ap->z = new float(13.37f); // This will be leaked
  delete ap;
  // You may find that the following still works:
  // std::cout << ap.x << std::endl;
}

の後delete ap、 が指すオブジェクトapは破棄されます。そのメンバーはすべて破棄されています: xy、およびzはなくなりました。ただし、これzは単なるポインタであることに注意してください。ポインターは破棄されますが、ポインターがfloat指しているオブジェクトは破棄されません。あなたdelete ap->zも確認する必要があります。簡単に言うと、 が 2 つあるnewのに 1 つしかないdeleteということです。これは、メモリ リークが発生していることを示す非常に良い兆候です。このコードは、動的に割り当てられた をリークしますfloat

上記のコード コメントで述べたように、オブジェクトのメンバーにアクセスしようとしても問題なく動作し、正しい値を取得することさえできます。しかし、それは大丈夫ではありません。deletedされたオブジェクトの任意の部分にアクセスしようとすると、未定義の動作が発生します。これは、正常に動作しているように見えることを含め、あらゆることが起こり得ることを意味します。未定義の動作を呼び出す C++ は完全に信頼性が低く、ユニバースを破壊する可能性があります。

于 2012-12-26T17:18:06.683 に答える
0

それらが最初のインスタンスに固有であることを意図したクラス インスタンスへのポインタである場合は、それらを削除する必要があります。それ以外の場合、それらはコンテナーと共に削除されます。

于 2012-12-26T17:17:37.660 に答える