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建议的那样,添加到 Zac Howland 的答案中,

不保证会发生重新分配,也不保证向量容量会由于调用此函数而改变。强制重新分配的典型替代方法是使用交换:

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

这会将临时空向量的内容与x. 然后将为临时(以前为空)向量调用析构函数,该向量将依次为其所有向量元素调用析构函数,最后将释放所有空间。

于 2013-10-31T21:42:22.380 回答
2

是和不是。它将为顶部向量中的每个元素调用析构函数,并且每个向量的析构函数将清除它自己的内存(因此它clear不必为每个内部向量调用)。

clear但是,不能保证释放顶层向量使用的内存。

于 2013-10-31T21:40:22.263 回答