3

以下がメモリリークなしで意図したとおりに機能することを確認したい:

vector<vector <float> > X;
for (int i = 0; i < some_size; i++)
{
     vector<float> column;
     X.push_back(column);
}
// ... use 2D array somehow
X.clear(); 
/* CALLS DESTRUCTOR OF EACH ELEMENT, BUT SINCE EACH ELEMENT
IS A VECTOR, CLEAR IS RECURSIVELY CALLED ON EACH OF THOSE*/

つまり、ベクトルのデストラクタの一部であるclear()ため、ベクトルのベクトルに再帰的に適用されますか?clear

X範囲外になると完全にクリアされることはわかっていますが、それはここでの質問のポイントではありません。

4

2 に答える 2

3

のドキュメントvector<T>::clear示唆するように、ザック・ハウランドの答えに追加すると、

再割り当てが発生することは保証されておらず、この関数の呼び出しによってベクトル容量が変更されることは保証されていません。再割り当てを強制する典型的な代替手段は、swap を使用することです。

vector<T>().swap(x);   // clear x reallocating

これにより、一時的な空のベクターの内容が の内容と交換されxます。次に、デストラクタが一時的な (以前は空だった) ベクトルに対して呼び出され、次にすべてのベクトル要素に対してデストラクタが呼び出され、最後にすべてのスペースが割り当て解除されます。

于 2013-10-31T21:42:22.380 に答える
2

はいといいえ。最上位ベクトルの各要素のデストラクタを呼び出し、各ベクトルのデストラクタはそれ自体のメモリをクリアします (したがってclear、内部ベクトルのそれぞれに対して必ずしも呼び出しているわけではありません)。

clearただし、最上位のベクトルによって使用されるメモリが解放される保証はありません。

于 2013-10-31T21:40:22.263 に答える