64

C ++でのものを削除することに関して、私は完全に混乱しています。オブジェクトの配列を宣言し、clear()メンバー関数を使用する場合。メモリが解放されたことを確認できますか?

例えば ​​:

tempObject obj1;
tempObject obj2;
vector<tempObject> tempVector;

tempVector.pushback(obj1);
tempVector.pushback(obj2);

clear を安全に呼び出してすべてのメモリを解放できますか? それとも、1 つずつ削除するために繰り返し処理する必要がありますか?

tempVector.clear();

このシナリオをオブジェクトのポインターに変更すると、答えは上記と同じになりますか?

vector<tempObject> *tempVector;
//push objects....
tempVector->clear();
4

7 に答える 7

100

clear を呼び出すと、すべてのオブジェクトが破棄されますが、メモリは解放されません。個々の要素をループしても役に立ちません (オブジェクトに対してどのようなアクションを提案しますか?) あなたができることは次のとおりです。

vector<tempObject>().swap(tempVector);

これにより、メモリが割り当てられていない空のベクターが作成され、tempVector とスワップされ、メモリの割り当てが効果的に解除されます。

C++11 には関数 もあり、shrink_to_fitclear() の呼び出しの後に呼び出すことができ、理論的にはサイズ (現在は 0) に合わせて容量を縮小します。ただし、これは拘束力のない要求であり、実装は自由に無視できます。

于 2012-05-05T18:59:17.323 に答える
31

ここには2つの別々のものがあります:

  1. オブジェクトの有効期間
  2. 保存期間

例えば:

{
    vector<MyObject> v;
    // do some stuff, push some objects onto v
    v.clear(); // 1
    // maybe do some more stuff
} // 2

1、クリアしますv。これにより、保存していたすべてのオブジェクトが破棄されます。あなたが書いたものであれば、それぞれがそのデストラクタを呼び出し、それによって所有されているものはすべてMyObject解放されます。 ただし、ベクターvには、後で必要になった場合に備えて、生のストレージを保持する権利があります。

1と の間にさらに何かをプッシュする場合は2、古いメモリを再利用できるため、時間を節約できます。

2、ベクターvはスコープ外になります。それ以降にプッシュしたオブジェクトはすべて1破棄されます (あたかも明示的にもう一度 clear を呼び出したかのように) v。 )。


v動的に割り当てられたベクトルへのポインターになるように例を変更した場合は、明示的に削除する必要があり2ます。std::unique_ptrその場合のようなものを使用することをお勧めしますが、そうしないvでリークすると、割り当てられたストレージもリークされます。上記のように、vが削除されていることを確認する必要があり、呼び出すclearだけでは不十分です。

于 2012-05-05T19:08:36.457 に答える
0

ベクトルを何度も使用する必要があり、現在のコードがループ内または関数呼び出しごとに繰り返し宣言する場合、メモリ不足になる可能性があります。外部で宣言し、関数内でポインターとして渡し、次を使用することをお勧めします。

my_arr.resize()

このようにして、毎回新しいシーケンスを要求するのではなく、ベクターに同じメモリ シーケンスを使用し続けます。これが役に立ったことを願っています。注: 異なるサイズにサイズ変更すると、ランダムな値が追加される場合があります。必要に応じて、0 などの整数を渡して初期化します。

于 2017-06-06T19:47:57.970 に答える