2015-06-20 216 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(); 
} 

如果你用一些容器,它的工作不是一個標準的容器,那麼你將不得不諮詢它的文檔來查看它支持的操作。

編寫預期容器具有未知接口的代碼是不可能的。