【发布时间】:2017-08-20 15:46:22
【问题描述】:
谁能证明以下方法之一可以保证以独立于平台的方式释放向量的内存?
vector<double> vec;
//populating vec here
清理:
1- 缩小以适应方法
vec.clear();
vec.shrink_to_fit();
2-交换方法
vector<double>().swap(vec);
【问题讨论】:
-
为什么你认为交换解决方案不会释放内存?
-
这是一个骗局 - 如果您想清空 a 向量,请使用交换成语,它使用标准的、记录在案的语言特性。
-
C++ 谈到了释放内存。释放的内存没有义务被“释放”,它只是变得无效。
shrink_to_fit非常明确地拒绝提供解除分配的保证(这是一个非绑定请求)。swap也不保证。临时对象的销毁将可能释放其内存,但不再承诺(C++ 标准库 dtor 不保证释放任何内容或以其他方式无泄漏)。在这种情况和许多其他情况下,我们依靠实现来做正确的事情。 -
TimoGeusch 在下面的 cmets 中回答。这里的误解是空向量不分配内存。这不是真的。它没有在标准中指定,因此它可以是 0 或 4 或 256 或其他任何值。它是特定于实现的。当我们说“空闲内存”时,我们真正的意思是将其恢复到全新的构造状态。
-
@Robinson:是的。但它仅出于调试目的而这样做。并且它分配的内存不用于存储向量的元素。它用于跟踪迭代器。注意
#if _ITERATOR_DEBUG_LEVEL == 0包围的部分发生了什么。没有分配。