2015-06-20 215 views
0

说我有一个标准集装箱类:用std :: move()释放内存?

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

的常用方法来清除容器是“清除”,但大多数代码不“兼容STL”这么多集装箱(第三方)可能不有一个“清晰”的方法。然而,如果他们有移动语义,我可以使用std :: move右键?

void putOnFire(){ 
    auto p = std::move(books); //books cleared when p out of scope 
} 

这是编写最通用的可能的代码,它也适用于不是带有“清除”方法的STL容器的东西。

+0

如果您有一个带有标准容器的类,那么该容器将具有标准接口。 –

回答

5

std::move以有效但未指定的状态保留移动的对象。特别是它可能会保持原来的样子,所以虽然这实际上可能适用于您的stl实现,但它肯定不适用于所有第三方容器。 (也许在将来的任何一点,当你的STL实现,由于变为更新破解)

3

我不会推荐这个。首先,它掩盖了意图。请使用c.clearc.erase(c.begin(), c.end())。无法清除/移除元素的容器不是合适的动态大小的容器。此外,您提出的解决方案取决于特定容器类型的移动构造函数,该类型是实现定义的,不需要释放内存。

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

+0

你认为'std :: array '是一个容器吗? –

+1

@KerrekSB:好点。我认为无关紧要,该标准将其定义为序列容器; )。我编辑了答案,也许现在好一点。 – erenon

2

向量可以有其内存中释放:

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

如果你用一些容器,它的工作不是一个标准的容器,那么你将不得不咨询它的文档来查看它支持的操作。

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