我是C ++的新手,所以这可能是一个新手问题但是我并不完全清楚如何从内存中清除它。我在网上搜索并看了几个答案,但不知道如何正确执行我想要做的事情。
如何在c ++中正确地从内存中清除矢量?谢谢,如果这是一个重复的帖子我很抱歉。
vector<ElementData> Elements;
如下面的评论所述,我想返回使用的内存。
除了它不会将任何内存返回给系统 容量保持不变。
答案 0 :(得分:11)
如果你想重置向量回到空状态,那么我们可以使用swap
技巧将向量的内容交换成一个临时的,它会被破坏并释放内存
vector<ElementData> Elements
// fill the vector up
vector<ElementData>().swap(Elements);
这将创建一个临时空向量,将其与您拥有的向量交换,现在它为空,然后销毁临时向量中的所有内容。
你可以看到它在这个小例子中起作用
int main() {
std::vector<int> foo(500);
std::cout << foo.capacity() << std::endl;
std::vector<int>().swap(foo);
std::cout << foo.capacity() << std::endl;
}
答案 1 :(得分:3)
当你的程序结束时,vector
的dtor将被调用并删除你的向量,因为你已经在堆栈中分配了它。此外,将为向量中的每一个调用ElementData
的dtor。
答案 2 :(得分:3)
要明确地完全清除矢量,首先清除矢量(销毁元素)
v.clear()
然后返回先前为向量元素保留的内存
v.shrink_to_fit();
http://en.cppreference.com/w/cpp/container/vector/shrink_to_fit
如果之前包含的元素可能比您要填充的元素多得多,则只能调用shrink_to_fit
。
答案 3 :(得分:0)
你不需要做任何特别的事情。由于向量和内部元素都是静态分配的(即不是由new创建的),当向量超出范围时,它被解除分配并且析构函数在内部的所有ElementData上被调用。如果你有 ... +"<br>#{location.field}" ...
,其中向量只包含指向ElementData的指针,那么你自己也必须vector<ElementData*>
所有的ElementData。
答案 4 :(得分:0)
在大多数情况下,最好的方法是将矢量范围限制在实际需要的位置。所以,而不是像:
vector<Elements> Elements;
... do some work with Elements ...
Elements.clear(); // or whatever "trick" you want to use
... do more work where Elements is not needed ...
你会这样做:
{ // begin a new scope
vector<Elements> Elements;
... do some work with Elements ...
} // Elements is now out of scope, its memory has been freed
... do more work where Elements is not needed ...
这样做的另一个好处是,在Elements
超出范围后,您无法意外地重复使用它。如果函数很小,则可能不需要创建新的显式范围。从函数返回将具有相同的效果。
答案 5 :(得分:-1)
Elements.clear()
会做你想要的。
Here是向量可用的其余函数。