当我完成向量时,是否需要调用clear()? [重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当我完成向量时,是否需要调用clear()? [重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
当向量的元素被动态分配/是指针时,我所看到的所有问题都是关于管理内存的问题。我的问题是关于已经在堆栈上分配的向量,具有简单类型,例如int
。
如果我有以下代码:
std::vector<int> vec(5);
for(int i = 0; i < vec.size(); i++) {
std::cout << vec[i] << std::endl;
}
我完成后是否需要打电话给clear()
?
No.
C ++中的类有一个析构函数,当类对象超出范围或被删除时会被调用。虽然你是正确的,std::vector
动态分配空间,std::vector
析构函数将为你释放内存,导致一个快乐的无泄漏程序。
从cppreference page,当矢量析构函数被称为它...
破坏容器。调用元素的析构函数并释放已使用的存储。请注意,如果元素是指针,则不会销毁指向的对象。
另请注意,从清楚的cppreference,功能......
使向量的容量()保持不变......
因此,当你打电话给clear
时,内存实际上甚至没有被释放! (有关this SO question实际上在做什么的更多信息,请参阅clear
)
如果你担心释放(大)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
保存的内存。
以上是关于当我完成向量时,是否需要调用clear()? [重复]的主要内容,如果未能解决你的问题,请参考以下文章
ViewContainerRef.clear() 是不是从内存中删除组件?