Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::move()释放内存?_C++_C++11_Move Semantics - Fatal编程技术网

C++ 使用std::move()释放内存?

C++ 使用std::move()释放内存?,c++,c++11,move-semantics,C++,C++11,Move Semantics,说我有一个带有标准容器的类: class Library{ std::vector<Book> books; public: void putOnFire(){ books.clear(); } }; 这是为了编写最通用的代码,这些代码也可以使用非STL容器的“clear”方法 我不推荐这个。首先,它模糊了意图。使用c.clear或c.erase(c.begin(),c.end())。无法擦除/删除元素的容器不是适当的动态大小的容器。此外,您

说我有一个带有标准容器的类:

class Library{
    std::vector<Book> books;
public:
    void putOnFire(){
        books.clear();
    }
};

这是为了编写最通用的代码,这些代码也可以使用非STL容器的“clear”方法

我不推荐这个。首先,它模糊了意图。使用
c.clear
c.erase(c.begin(),c.end())
。无法擦除/删除元素的容器不是适当的动态大小的容器。此外,您建议的解决方案取决于特定容器类型的move构造函数(由实现定义),不需要释放内存


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

std::move
将moved from对象保持在有效但未指定的状态。特别是,它可能会保持与以前完全相同的方式,因此,尽管这实际上可能适用于stl的实现,但它肯定不会适用于所有第三方容器。(当stl的实现因更新而发生更改时,可能会在将来的任何时候中断)

矢量可以释放其内存:

void putOnFire()
{
    books.clear();
    books.shrink_to_fit();
}
如果您使用的容器不是标准容器,那么您必须查阅它的文档,查看它支持哪些操作


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

如果你有一个带有标准容器的类,那么容器将有标准的接口。你认为<代码> STD::数组< /代码>是一个容器吗?@ KeRekSB:好点。不管我怎么想,标准将其定义为序列容器;)。我编辑了答案,也许现在稍微好一点。
void putOnFire()
{
    books.clear();
    books.shrink_to_fit();
}