私は研究をしていて、何も関係ないのでここに来ました。
私はメモリリークを回避しようとしているので、私は思っています:
クラスMyClass
にメンバーint
s a
とb
、およびint array c
があり、メンバー関数に入力されているとします。
class MyClass
{
public:
int a, b;
int c[2];
void setVariables()
{
a, b = 0;
for (int i = 0; i < 2; i++)
{
c[i] = 3;
}
}
};
int main(int argc, char* argv[])
{
MyClass* mc = new MyClass();
mc->setVariables();
delete mc;
}
delete mc
を呼び出した後、a
、b
、およびc
のすべての内容も削除されますか?それとも、MyClass
のデストラクタで明示的に行う必要がありますか?
_delete mc
_が実行されると、コンパイラはオブジェクトのデストラクタ(MyClass::~MyClass()
)を呼び出し、それに関連付けられているメモリの割り当てを解除します。
デフォルトのデストラクタ(独自のデストラクタを宣言しない場合)は、すべてのメンバー変数のデストラクタを、宣言によって最後から最初の順に呼び出します(つまり、この場合はc
、次にb
、次にa
)。この例のメンバーは PODタイプ (デストラクタがないため)なので、作業は行われません。
ルールは非常に簡単です。new
で作成されたすべてのオブジェクトは、delete
で一度だけ破棄する必要があります。 new[]
で作成されたすべての配列は、delete[]
で1回だけ破棄する必要があります。他のすべてを削除してはなりません。だからあなたのコードは正しいです。 mc
で作成した後にnew
を削除し、new
で作成していないメンバーは削除しません。
プログラムフローが複雑になると(特に例外が関係する場合)、ルールを適用するのは非常に難しい場合があります。そのため、オブジェクトを自分で削除するのではなく、new
の結果をすぐに使用してスマートポインタを初期化し、オブジェクトを管理することをお勧めします。
クラスメンバーは、クラスのメモリ構造の一部です。
したがって、そのメモリを解放すると、メンバーも解放されます。
注意:
ポインタがある場合、それらも破壊されます[〜#〜]しかし[〜#〜]彼らが指すメモリは破壊された。
クラスメモリ消費の詳細:
クラス内の変数にはクラススコープがあり、クラスがあると破棄されます。あなたが心配する必要がある唯一のことはポインタです-それらはあなたのデストラクタで適切に扱われる必要があるでしょう。
あなたの具体的な例では、答えはイエスです。これは、スタックにメンバー変数を割り当てたためです。 new
を使用してメンバー変数にメモリを割り当てた場合、答えは「いいえ」となり、クラスのデストラクタのメンバー変数を明示的に削除する必要があります。
class MyClass(): heapVariabl(NULL)
{
MyClass()
{}
~MyClass()
{
delete heapVariable;
}
int a, b;
int[2] c;
int *heapVariable;
void setVariables()
{
a, b = 0;
heapVariable = new int; // <- requires deletion in destructor to free memory
*heapVariable = 0;
for (int i = 0; i < 2; i++)
{
c[i] = 3;
}
}
}
オブジェクトを解放すると、そのすべてのメンバー変数も自動的に解放されます。したがって、あなたのケースでは、はい、a
、b
およびc
はすべて解放されます。
ただし、メンバー変数の1つがポインターである場合は、ポインター自体のみが自動的に解放されますnotそれが指すオブジェクト-これは、独自のデストラクタを記述する必要がある最も一般的なケースです。
delete
は、オブジェクトに含まれるメモリを解放します。型が動的に割り当てられたメモリへのポインタを保持している場合は、デストラクタ内でそれらをクリーンアップする必要があります。
あなたの特定の質問については:
delete mcを呼び出した後、a、b、およびcのすべての内容も削除されますか?それとも、MyClassのデストラクタで明示的に行う必要がありますか?
それらは動的に割り当てられなかったため、クリーンアップされます。
3つの変数はnew
で割り当てられていないため、それらを削除する必要はまったくありません。
それらはwouldクラスがdelete
dのときに破壊されます(クラスがnew
dのときに割り当てられたため)、しかしそれは削除されるのと同じではありません。