2013-10-31 17 views
2

我想确保了以下工作,因为我不打算内存泄漏:C++ 2D矢量清晰地按照预期工作?

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在超出范围时被完全清除,但这不是问题的关键。

+11

是的。 (插入更多字符) – yngccc

+0

仅供参考,您的'for'循环可以简化为'X.resize(some_size)',或者您可以将其创建为'vector > X(some_size);' –

回答

3

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

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

+0

就是这样。 –

+0

你能详细说明一下吗?顶级,X是什么意思?那么,如果我需要在X超出范围之前执行此操作,clear()后应该怎么做? – Tommy

+0

@Tommy:在此上下文中的“顶部”是指外部向量(您在此创建的2D向量的第一维)。由于该向量中的每个元素也是一个向量。当你调用'clear'时,它会调用析构函数为其中的每个元素(每个矢量)。它不保证释放空间*(它表示外部矢量)正在使用的空间。如果你想这样做,你可以通过'vector >()。swap(X)'来实现,这将有效地减少向量到实现默认容量的能力。 –

3

添加到扎克霍兰德的回答,为documentationvector<T>::clear表明,

重新分配并不一定会发生的,和矢量能力 不能保证因调用此函数改变。一种典型的替代 迫使重新分配是使用交换:

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

这将交换的临时空载体的内容与那些x。然后,析构函数将被调用临时(先前为空)的向量,该向量将依次调用所有向量元素的析构函数,最后将释放所有空间。

+0

交换将不会重新分配 –

+0

@DieterLücking:我没有说它会(实际上我甚至没有使用这个词,摘录来自文档)。在最后一段中,我解释了为什么这个空间将被分配;它不是交换,它是暂时的空向量。 – nickie