我想确保以下工作正如我打算没有内存泄漏:
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
在超出范围时会被彻底清除,但这不是问题的重点。
答案 0 :(得分:3)
是和否。它将为顶部向量中的每个元素调用析构函数,每个向量的析构函数将清除它自己的内存(因此它不会为每个内部向量调用clear
)。
clear
不保证释放顶级向量使用的内存。
答案 1 :(得分:3)
添加到Zac Howland的答案,正如vector<T>::clear
的{{3}}所示,
无法保证重新分配,矢量容量为 由于调用此函数,无法保证更改。一个典型的 强制重新分配的替代方法是使用swap:
vector<T>().swap(x); // clear x reallocating
这会将临时空向量的内容与x
的内容交换。然后将为临时(先前为空)向量调用析构函数,该向量将依次调用其所有向量元素的析构函数,最后将释放所有空间。