2014-10-07 52 views
-1

我有一個指針切片,但我不完全知道在哪裏和爲什麼。 有兩行代碼,我認爲可能會導致拼接:切片發生與unique_ptr?

的唯一指針的創建:

map.insert(make_pair("ChildA", unique_ptr<Base>(new ChildA()))); 

和原始指針從我的唯一指針返回:

return map["ChildA"].get(); 

請注意:

  • 類ChildA繼承基
  • 基座具有虛析構函數
  • 在以上示例中的地圖的類型爲:

    map<string, unique_ptr<Base> > 
    

剪接是否發生在任一的代碼上述的行?有沒有簡單的方法來避免它在哪裏?

+1

你的意思是'返回地圖[「ChildA」]。get()'對嗎? – WhozCraig 2014-10-07 07:05:25

+1

'返回地圖[ChildA] .get()'不是有效的代碼 - 永遠[後REAL代碼](http://stackoverflow.com/help/mcve)。 – Angew 2014-10-07 07:05:26

+2

IIRC,切片只發生在值對象的副本上;所以沒有引用,而不是指針(即使在智能指針中)。因此,這取決於包含'return map [ChildA] .get();'的函數簽名中的類型。簽名是什麼以及結果如何使用? – Niall 2014-10-07 07:05:41

回答

0

就我所見,您所發佈的代碼中沒有切片發生。

演示:如果你試圖通過價值的Child1複製到Base會發生http://ideone.com/8InZ6H

切片。你確定你沒有在代碼中的其他任何地方做這件事嗎?