用 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.clearc.erase(c.begin(), c.end())。无法访问 erase/remove 元素的容器不是合适的动态大小容器。此外,您提出的解决方案取决于特定容器类型的移动构造函数,这是实现定义的,必须释放任何内存。

作为最后的手段,我建议使用 swap 而不是建议的移动。

std::move 使移出的对象处于有效但未指定的状态。特别是它可能会保持原样,因此虽然这实际上可能适用于您的 stl 实现,但它肯定不适用于所有第三方容器。 (并且当您的 stl 实施因更新而更改时,将来可能会在任何时候中断)

向量可以释放内存:

void putOnFire()
{
    books.clear();
    books.shrink_to_fit();
}

如果您使用的容器不是标准容器,则必须查阅其文档以了解它支持的操作。

编写代码来预测具有未知接口的容器是不可能的。