2016-08-23 70 views
11

我有一個工廠方法,可以創建一堆對象並返回指向它們的指針。對象的所有權轉移給來電者:如何返回指針(和所有權)的向量C++ 11

std::vector<animal*> create_zoo(); 

這可行,但容易發生內存泄漏。

auto zoo = create_zoo(); 

該向量位於堆棧上並自動清除,包含的對象不是。

返回各種子類型的對象。 Returing值而不是指針不會。

我想用

std::vector<std::unique_ptr<animal> > create_zoo(); 

unique_ptr沒有拷貝語義和我的價值,這從理論上講,創建一個副本返回vector

我可以把vector堆上,以避免

std::unique_ptr<std::vector<std::unique_ptr<animal> > > create_zoo(); 

但這越來越荒謬。

這應該工作太:

std::vector<std::shared_ptr<animal> > create_zoo(); 

這會工作,但它並沒有真正轉移所有權。調用者必須假定可能有其他指向對象的指針。

我願意接受建議。並不需要是std::vector。我只是在尋找一種實現工廠的好方法,該工廠使用現代C++來返回幾個對象的所有權。我現在正在避免提振。我試圖探索新的C++ 11的東西。

+0

您還可以重新考慮是否需要將動物對象分配爲指針。 'std :: vector '也可以用於你的目的。移動操作後,動物物體將被分配矢量並隨其移動。 –

回答

13

std::vector<std::unique_ptr<animal>>將正常工作:返回一個函數本地值將移動它,而不是複製它(或僅當移動不可用時)。

+0

嗯..這並不意味着我的代碼依賴於編譯器執行「返回值優化」的能力嗎?我知道所有相關的編譯器都已經實現了,但我不確定他們是否確實保證在所有情況下都能執行它。這是標準做法嗎? – Stefan

+6

@Stefan no,那不是RVO。 RVO將完全刪除本地功能,並將其用於呼叫方的位置。這是關於'return'移動 - 構建臨時返回對象(如果RVO事先未通過)。 – Quentin

+2

這就是我錯過的那一點!經過6年的Python後返回到C++。我感到生鏽和被寵壞。去讀這個「移動」的東西。謝謝! – Stefan