当我完成向量时,是否需要调用clear()? [重复]

问题描述 投票:5回答:2

这个问题在这里已有答案:

当向量的元素被动态分配/是指针时,我所看到的所有问题都是关于管理内存的问题。我的问题是关于已经在堆栈上分配的向量,具有简单类型,例如int

如果我有以下代码:

std::vector<int> vec(5);
for(int i = 0; i < vec.size(); i++) {
    std::cout << vec[i] << std::endl;
}

我完成后是否需要打电话给clear()

c++ memory-management
2个回答
10
投票

No.

C ++中的类有一个析构函数,当类对象超出范围或被删除时会被调用。虽然你是正确的,std::vector动态分配空间,std::vector析构函数将为你释放内存,导致一个快乐的无泄漏程序。

cppreference page,当矢量析构函数被称为它...

破坏容器。调用元素的析构函数并释放已使用的存储。请注意,如果元素是指针,则不会销毁指向的对象。


另请注意,从清楚的cppreference,功能......

使向量的容量()保持不变......

因此,当你打电话给clear时,内存实际上甚至没有被释放! (有关this SO question实际上在做什么的更多信息,请参阅clear


6
投票

如果你担心释放(大)vector中分配的内存(因此阻止在其他地方使用),你应该

  1. 确保相应向量的范围/生命周期限于其即将使用的区域/时间,以便其销毁自动释放内存。
  2. 如果失败(无论出于何种原因),你可以 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保存的内存。

© www.soinside.com 2019 - 2024. All rights reserved.