web-dev-qa-db-ja.com

クラスを削除すると、そのメンバー変数は自動的に削除されますか?

私は研究をしていて、何も関係ないのでここに来ました。

私はメモリリークを回避しようとしているので、私は思っています:

クラスMyClassにメンバーints ab、および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を呼び出した後、ab、およびcのすべての内容も削除されますか?それとも、MyClassのデストラクタで明示的に行う必要がありますか?

27
Keelx

_delete mc_が実行されると、コンパイラはオブジェクトのデストラクタ(MyClass::~MyClass())を呼び出し、それに関連付けられているメモリの割り当てを解除します。

デフォルトのデストラクタ(独自のデストラクタを宣言しない場合)は、すべてのメンバー変数のデストラクタを、宣言によって最後から最初の順に呼び出します(つまり、この場合はc、次にb、次にa)。この例のメンバーは PODタイプ (デストラクタがないため)なので、作業は行われません。

29
greyfade

ルールは非常に簡単です。newで作成されたすべてのオブジェクトは、deleteで一度だけ破棄する必要があります。 new[]で作成されたすべての配列は、delete[]で1回だけ破棄する必要があります。他のすべてを削除してはなりません。だからあなたのコードは正しいです。 mcで作成した後にnewを削除し、newで作成していないメンバーは削除しません。

プログラムフローが複雑になると(特に例外が関係する場合)、ルールを適用するのは非常に難しい場合があります。そのため、オブジェクトを自分で削除するのではなく、newの結果をすぐに使用してスマートポインタを初期化し、オブジェクトを管理することをお勧めします。

33
Mike Seymour

クラスメンバーは、クラスのメモリ構造の一部です。

したがって、そのメモリを解放すると、メンバーも解放されます。

注意:
ポインタがある場合、それらも破壊されます[〜#〜]しかし[〜#〜]彼らが指すメモリは破壊された。

クラスメモリ消費の詳細:

C++クラス

6
Yochai Timmer

クラス内の変数にはクラススコープがあり、クラスがあると破棄されます。あなたが心配する必要がある唯一のことはポインタです-それらはあなたのデストラクタで適切に扱われる必要があるでしょう。

4
wanovak

あなたの具体的な例では、答えはイエスです。これは、スタックにメンバー変数を割り当てたためです。 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;          
     }     
   } 


} 
4
nathan

オブジェクトを解放すると、そのすべてのメンバー変数も自動的に解放されます。したがって、あなたのケースでは、はい、abおよびcはすべて解放されます。

ただし、メンバー変数の1つがポインターである場合は、ポインター自体のみが自動的に解放されますnotそれが指すオブジェクト-これは、独自のデストラクタを記述する必要がある最も一般的なケースです。

3
HighCommander4

deleteは、オブジェクトに含まれるメモリを解放します。型が動的に割り当てられたメモリへのポインタを保持している場合は、デストラクタ内でそれらをクリーンアップする必要があります。

あなたの特定の質問については:

delete mcを呼び出した後、a、b、およびcのすべての内容も削除されますか?それとも、MyClassのデストラクタで明示的に行う必要がありますか?

それらは動的に割り当てられなかったため、クリーンアップされます。

1
Ed S.

3つの変数はnewで割り当てられていないため、それらを削除する必要はまったくありません。

それらはwouldクラスがdeletedのときに破壊されます(クラスがnewdのときに割り当てられたため)、しかしそれは削除されるのと同じではありません。

1
Mark B