クラスがあり、それを削除したいです。クラス内には、さまざまな変数、文字列、ベクトルなどがあります。
別のクラスから呼び出すと:
delete myClass;
そして、新しい myClass を作成すると、変数がまだそこにあるように見えます。
内部の各変数を手動で削除する必要がありますか:
myClass::~myClass()
{
}
助けてくれてありがとう!
クラスがあり、それを削除したいです。クラス内には、さまざまな変数、文字列、ベクトルなどがあります。
別のクラスから呼び出すと:
delete myClass;
そして、新しい myClass を作成すると、変数がまだそこにあるように見えます。
内部の各変数を手動で削除する必要がありますか:
myClass::~myClass()
{
}
助けてくれてありがとう!
オブジェクトが破棄されると、そのオブジェクトのすべてのメンバーが破棄されます。例えば:
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
は破棄されます。そのメンバーはすべて破棄されています: x
、y
、およびz
はなくなりました。ただし、これz
は単なるポインタであることに注意してください。ポインターは破棄されますが、ポインターがfloat
指しているオブジェクトは破棄されません。あなたdelete ap->z
も確認する必要があります。簡単に言うと、 が 2 つあるnew
のに 1 つしかないdelete
ということです。これは、メモリ リークが発生していることを示す非常に良い兆候です。このコードは、動的に割り当てられた をリークしますfloat
。
上記のコード コメントで述べたように、オブジェクトのメンバーにアクセスしようとしても問題なく動作し、正しい値を取得することさえできます。しかし、それは大丈夫ではありません。delete
dされたオブジェクトの任意の部分にアクセスしようとすると、未定義の動作が発生します。これは、正常に動作しているように見えることを含め、あらゆることが起こり得ることを意味します。未定義の動作を呼び出す C++ は完全に信頼性が低く、ユニバースを破壊する可能性があります。
それらが最初のインスタンスに固有であることを意図したクラス インスタンスへのポインタである場合は、それらを削除する必要があります。それ以外の場合、それらはコンテナーと共に削除されます。