释放VC++2019中std::vector的内存
我最近开始将我当前的项目从 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
如果你不能把它交换掉,释放向量的内存的新推荐方法是什么?
回答
你做的倒退。要以有保证的方式清除和释放向量的内存,请声明一个临时向量并将需要清除的向量交换到其中。这会将您的代码调整为
std::vector<int>{}.swap(v);
在表达式结束时,临时对象将被销毁,并带走v它的内存。
之前这项工作的原因是微软有一个邪恶的扩展,默认情况下它允许纯右值绑定到非常量左值引用。由于不再使用该扩展,旧的非标准代码现在无法编译。