证明shrink_to_fit或交换保证释放矢量的内存
Proof that shrink_to_fit or swap guarantees to release vector's memory
任何人都可以提供证据证明以下方法之一提供了以独立于平台的方式释放矢量内存的保证吗?
vector<double> vec;
//populating vec here
清理:
1-收缩以适合方法
vec.clear();
vec.shrink_to_fit();
2- 交换方法
vector<double>().swap(vec);
使用new
创建vector
不太可能做我认为你想做的事情。
std::vector
实现通常只"保证"它们将分配足够的内存来容纳最少数量的元素。后者很重要,因为在需要增大矢量时要求操作系统或运行时提供更多内存是一项昂贵的操作,也可能触发元素复制。出于这个原因,许多实现使用一些启发式方法来确定当向量必须增长到一定大小时分配的大小。例如,我熟悉的一个实现会在每次需要新内存时将分配大小加倍,从而为您提供 2^x 分配模式。
对于这样的分配模式,尝试将向量从 90 个元素缩小到 70 个元素几乎可以保证保持分配的内存大小相同,以便为额外的增长空间预留空间。
如果您出于某种原因需要确切的内存分配大小,如果您知道编译时的大小,您几乎必须使用std::array
,或者自己管理数组。
相关文章:
- 如何在c++中释放内存
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 释放内存(主题模板)时出现问题
- 使用后自动释放内存
- C++ 如何释放内存
- 从函数内对象的向量中释放内存
- C++ 在不释放内存的情况下调用析构函数
- 多个线程之间的获取-释放内存顺序
- C++ - 析构函数只是释放内存还是实际删除对象
- 使用 RAII 替换最终块以释放内存
- 如何通过带有指向基类的指针的删除运算符释放内存
- 代码中的"sprintf"用法是否需要释放内存?
- C++何时使用 delete[] 并正确释放内存?
- 为什么此获取和释放内存围栏不能给出一致的值?
- 抛出新表达式的参数子表达式时释放内存
- 在这种情况下,如何释放内存?
- 在 c++ 中应按什么顺序释放内存?