用 std::move() 释放内存?
Releasing memory with std::move()?
说我有一个带标准容器的 class:
class Library{
std::vector<Book> books;
public:
void putOnFire(){
books.clear();
}
};
清除容器的常用方法是"clear",但是大多数代码不是"STL compliant",所以许多容器(第三方)可能没有"clear" 方法。但是,如果他们有移动语义,我可以使用 std::move 对吗?
void putOnFire(){
auto p = std::move(books); //books cleared when p out of scope
}
这是为了编写最通用的可能代码,这些代码也适用于具有 "clear" 方法的非 STL 容器。
我不推荐这个。首先,它掩盖了意图。使用 c.clear
或 c.erase(c.begin(), c.end())
。无法访问 erase/remove 元素的容器不是合适的动态大小容器。此外,您提出的解决方案取决于特定容器类型的移动构造函数,这是实现定义的,必须释放任何内存。
作为最后的手段,我建议使用 swap
而不是建议的移动。
std::move
使移出的对象处于有效但未指定的状态。特别是它可能会保持原样,因此虽然这实际上可能适用于您的 stl 实现,但它肯定不适用于所有第三方容器。 (并且当您的 stl 实施因更新而更改时,将来可能会在任何时候中断)
向量可以释放内存:
void putOnFire()
{
books.clear();
books.shrink_to_fit();
}
如果您使用的容器不是标准容器,则必须查阅其文档以了解它支持的操作。
编写代码来预测具有未知接口的容器是不可能的。
说我有一个带标准容器的 class:
class Library{
std::vector<Book> books;
public:
void putOnFire(){
books.clear();
}
};
清除容器的常用方法是"clear",但是大多数代码不是"STL compliant",所以许多容器(第三方)可能没有"clear" 方法。但是,如果他们有移动语义,我可以使用 std::move 对吗?
void putOnFire(){
auto p = std::move(books); //books cleared when p out of scope
}
这是为了编写最通用的可能代码,这些代码也适用于具有 "clear" 方法的非 STL 容器。
我不推荐这个。首先,它掩盖了意图。使用 c.clear
或 c.erase(c.begin(), c.end())
。无法访问 erase/remove 元素的容器不是合适的动态大小容器。此外,您提出的解决方案取决于特定容器类型的移动构造函数,这是实现定义的,必须释放任何内存。
作为最后的手段,我建议使用 swap
而不是建议的移动。
std::move
使移出的对象处于有效但未指定的状态。特别是它可能会保持原样,因此虽然这实际上可能适用于您的 stl 实现,但它肯定不适用于所有第三方容器。 (并且当您的 stl 实施因更新而更改时,将来可能会在任何时候中断)
向量可以释放内存:
void putOnFire()
{
books.clear();
books.shrink_to_fit();
}
如果您使用的容器不是标准容器,则必须查阅其文档以了解它支持的操作。
编写代码来预测具有未知接口的容器是不可能的。