在 VC++ 2019 中释放 std::vector 的内存

Release memory of std::vector in VC++ 2019

我最近开始将我当前的项目从 VS2015 升级到 VS2019,而 VS2019 在某些方面有更多限制。我特别有问题的一件事是我目前释放向量内存的方式:

std::vector<int> v(10);
v.swap(std::vector<int>()); // v should now be empty with no memory held

这在 VS2015 中运行良好,但在 VS2019 中它不再起作用,因为我交换的矢量是常量并且 vector::swap() 需要引用。这种行为最近发生了变化,并且对于比我更多的人来说肯定是个问题,因为这是释放向量内存的推荐方式。有关此问题的 MS 文档:https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-2/compiler-error-c2664?view=msvc-160

如果不能交换它,推荐的释放向量内存的新方法是什么?

vector I swap with is constant

它不是常量,但它是一个匿名的临时变量,所以它只能绑定到一个常量引用。

What is the new recommended way of releasing the memory of a vector if you can't swap it away?

嗯,你 可以 换掉它,如果你想保持向后兼容 and/or 不要相信 shrink_to_fit()。您只需为您的临时命名:

{
  std::vector<int> tmp;
  v.swap(tmp);
}

(如果您不需要保持与 C++98 的向后兼容,显然另一个答案中的反向匿名交换更简洁)。

你倒过来了。要以有保证的方式清除和释放向量的内存,请声明一个临时向量并将需要清除的向量交​​换到其中。那会将您的代码调整为

std::vector<int>{}.swap(v);

在表达式结束时,临时对象将被销毁,并带走v的内存。


之前这项工作的原因是 Microsoft 有一个默认情况下启用的 evil extension 允许纯右值绑定到非常量左值引用。由于不再启用该扩展,旧的非标准代码现在无法编译。