6

私が持っていて、 2人で、両方とも初期化されているVectorAと仮定します(つまり、)VectorBstd::vector<SameType>VectorA.size() > 0VectorB.size() > 0

私が行った場合:

VectorA = VectorB;

以前に割り当てられたメモリVectorAは自動的に解放されますか?

4

2 に答える 2

5

含まれているすべてのオブジェクトのデストラクタが呼び出され、ベクトルがメモリを所有しなくなったという意味で解放されます。1

しかし実際には、それはアロケータに返されるだけであり、実際にOSに返される場合とされない場合があります。

使用されているアロケータにバグがない限り、メモリリークが発生していません。それが懸念事項である場合は、


1. @Davidが以下のコメントで指摘しているように、サイズを変更する必要があるかどうかによっては、メモリの割り当てが必ずしも解除されるとは限りません。

于 2012-05-10T11:36:13.537 に答える
2

一般的に、必ずしも。一方のベクトルをもう一方に割り当てる場合、事後条件は、操作の最後に両方の配列に同等のオブジェクトが含まれることです。

capacity宛先ベクトルのが十分である場合、要素のセットに対して代入演算子min( v1.size(), v2.size() )を呼び出し、宛先ベクトルがより多くの要素を保持している場合は残りの要素を破棄するか、追加の要素をコピー構築することで、操作を実行できます。最後に。この場合、メモリの解放または割り当ては行われません。

宛先ベクトルに十分な容量がない場合は、十分な容量の新しいバッファーを作成し、ソースベクトルから新しいバッファー内の要素をコピー構築します。次に、古いバッファと新しいバッファを交換し、すべての古いオブジェクトを破棄して、古いバッファを解放します。この場合、古いオブジェクト破棄され、古いメモリが解放されますが、これは1つのケースにすぎません。

于 2012-05-10T11:59:08.353 に答える