11

1つの機能で。ローカルアレーを作成します。 char arr[20]; そして、この関数の終了前。コンパイラはガベージコレクションを行いますか?それとも私は自分でやる必要がありdeleteますか?

4

5 に答える 5

34

C++にはガベージコレクションはありません。

ただし、自動変数を使用すると、スコープから外れると破棄されます。

原則として、deleteごとに1回の呼び出しが必要newです。がない場合はnew、ありませんdelete

于 2012-05-10T18:06:34.167 に答える
9

この配列はスタック上に作成するため、削除する必要はありません。newを使用してアレイを作成した場合は、deleteを使用してクリーンアップする必要があります。

于 2012-05-10T18:05:49.860 に答える
2

ローカル変数は、それらが作成されたブロック(必ずしも関数である必要はありません)の最後で破棄されます。例えば:

void myfunc() { 
   int x[some_size];

   if (something) { 
       std::vector<std::string> y;
       // ...
   } // y will be destroyed here
   // more code
} // x will be destroyed here

関数を終了する前に配列を破棄したい場合は、同じものを利用することをお勧めします。

void f() { 
    // come code here   

    {
        int x[size];

         // code that uses x
    } // `x` gets destroyed here

    // more code
 }

ただし、その時点で変数を破棄しても、メモリ使用量には影響しない可能性があることを付け加えておきます。内部ブロックを終了した後はメモリは必要ありませんが、すぐに解放されない場合もあります。

一方、std::vector明示的な動的割り当ての代わりにのようなものを使用する場合、オブジェクトを破棄すると、オブジェクトのデータを格納するために使用されていたメモリが(すぐに)解放されます。

于 2012-05-10T18:25:17.843 に答える
1

ローカル変数(配列を含む)はスタック上に作成されるため、関数が戻るときに再利用されます。

これはガベージコレクションに似ていると考えることができますが、詳細は大きく異なります。あらゆる種類のプログラミングを行う場合は、他の言語についてさらに学ぶ必要があります(ほとんどの言語で同様です)。

いいえ、ローカル配列で何もする必要はありません。

于 2012-05-10T18:07:50.490 に答える
0

変数は、それらが定義されている関数内にのみ存在します。その関数が終了すると、変数はなくなります。またはtypeコマンドを使用して手動でメモリを割り当てた場合にのみ、変数をdelete/する必要があります。freenewmalloc

于 2012-05-10T18:07:23.547 に答える