当向量的元素被动态分配/是指针时,我所看到的所有关于管理内存的问题。我的问题只是一个已经在堆栈上分配的矢量,它有一个简单的类型,例如int
。
如果我有以下代码:
std::vector<int> vec(5);
for(int i = 0; i < vec.size(); i++) {
std::cout << vec[i] << std::endl;
}
完成后我是否需要致电clear()
?
答案 0 :(得分:10)
C ++中的类有一个析构函数,当类对象超出范围或被删除时会被调用。虽然你是正确的std::vector
动态分配空间,但std::vector
析构函数会为你释放内存,从而产生一个快乐的无泄漏程序。
从cppreference page开始,当向量析构函数被调用时......
破坏容器。调用元素的析构函数并释放已使用的存储。注意,如果元素是指针,则不会销毁指向的对象。
另请注意,从cppreference上清除,功能......
保持向量的容量()不变......
所以当你打电话给clear
时,内存实际上并没有被释放! (有关clear
实际正在做什么)的更多信息,请参阅this SO question
答案 1 :(得分:6)
如果你担心在(大)vector
中释放分配的内存(因此在其他地方被阻止使用),你应该
确保相应向量的范围/生命周期限于即将使用的区域/时间,以便其销毁自动释放内存。
失败(无论出于何种原因),你可以
vec.clear(); // reduces the size to 0, but not the capacity
vec.shrink_to_fit(); // suggests to reduce the capacity to size
assert(vec.capacity()==0);
请注意vector::clear()
在vector
中取消分配内存(只有内存,如果有的话,由向量元素动态分配)。 vector::shrink_to_fit()
建议将vector
的内存占用减少到实际大小,但实现可以选择忽略该请求。
最后,clear()
后跟shrink_to_fit()
的替代方法是交换习惯用法(在C ++ 11之前也可以使用):
vector<Tp>().swap(vec);
assert(vec.capacity()==0);
这里发生的是构造一个新的空向量(相同类型),然后立即与vec
交换,以便vec
变为空(零大小和容量)。最后,因为新的向量是一个临时的(未命名的)对象,所以它被破坏,从而取消分配最初保存在vec
的内存。