我刚接触C++,所以这可能是一个新手问题。但我不太清楚如何从内存中清除它。我在网上搜索并查看了几个答案,但对于如何正确执行我想做的事情还不清楚。
在C++中,如何正确清除向量(vector)的内存?谢谢,如果这是重复的帖子,请原谅。
vector<ElementData> Elements;
正如下面的评论所提到的,我也想返回所使用的内存。
除了容量保持不变之外,它将不会向系统返回任何内存。
我刚接触C++,所以这可能是一个新手问题。但我不太清楚如何从内存中清除它。我在网上搜索并查看了几个答案,但对于如何正确执行我想做的事情还不清楚。
在C++中,如何正确清除向量(vector)的内存?谢谢,如果这是重复的帖子,请原谅。
vector<ElementData> Elements;
正如下面的评论所提到的,我也想返回所使用的内存。
除了容量保持不变之外,它将不会向系统返回任何内存。
如果你想将向量重置为空状态,那么我们可以使用 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;
}
Elements = vector<ElementData>();
? - Christian HacklElements.swap(vector<ElementData>())
并不起作用,因为 swap
有一个 vector&
参数,所以它无法绑定到临时创建的 vector<ElementData>()
。 - NathanOlivertemplate <typename... Params> void clear_vector_memory(std::vector<Params...>& vec) { vector<Params...>().swap(vec); }
可能会更好。这样你的代码就变成了 clear_vector_memory(my_vector);
- NathanOliver当您超出作用域或它们所属的类对象被销毁时,std::vector变量通常会自动析构。std::vector的析构函数还会销毁向量中的所有元素。
要显式完全清除向量,请首先清除向量(销毁元素)。
v.clear()
然后返回之前为向量元素保留的内存。
v.shrink_to_fit();
只有在之前的向量可能包含比您要填充的元素更多时,才调用 shrink_to_fit
。
http://en.cppreference.com/w/cpp/container/vector/shrink_to_fit
当程序结束时,vector
的析构函数会被调用并为您删除堆栈上分配的向量。此外,对于向量中的每个ElementData
,其析构函数也将被调用。
而应该这样做:
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
超出作用域后,您不会意外地重复使用它。如果函数很小,您可能不需要创建新的显式作用域。从函数返回将具有相同的效果。你不需要做任何特殊的事情。由于向量和其中的元素都是静态分配的(即未通过new创建),当向量超出范围时,它将被释放,并且所有ElementData内部的析构函数将被调用。如果你有vector<ElementData*>
,其中向量仅包含指向ElementData的指针,则还必须自己delete
所有ElementData。
Elements.clear()
可以实现你想要的功能。
这里 是向量可用的其余函数。