2013-01-18 132 views
0

我看到,在一些奇怪的方式使用unique_ptr一些代碼的怪異使用,我不知道它是否甚至法律,儘管它看起來編譯在G ++罰款-std=c++0x的unique_ptr

#include <memory> 
#include <boost/unordered_map.hpp> 

typedef std::unique_ptr<std::string> str_ptr_t; 

typedef boost::unordered_map< int , str_ptr_t > map_t; 

str_ptr_t& get_ptr_value(map_t& map, int key) 
{ 
    return map[key]; 
}; 

int main() 
{ 
    map_t map; 
    str_ptr_t& ref_to_value_of_0 = get_ptr_value(map, 0); 
    map[0] = std::move(ref_to_value_of_0); 
}; 

簡要解釋說,地圖值類型是unique_ptr<std::string>。我初始化key = 0的值的引用。然後我繼續將該引用的內容移動到同一個實例值,所以基本上unique_ptr被移到自身上。這似乎是爲了避免創建指向對象的許多實例,如果已有實例存在,則嘗試重新使用現有條目實例,然後再次添加它。在現實中,分配隱藏在store界面中,並且參考從get界面返回,但整體序列可以在我看到前面

除了身爲有點怪異的代碼來概括,就是這種有效使用unique_ptr

+0

看起來很好(除了最後一行,它什麼都不做)。但是要注意,如果你在任何類Unix操作系統上,因爲'_t'類型是由POSIX保留的。 –

+0

命名空間範圍有兩個空的語句/聲明。兩個函數關閉後的兩個分號是錯誤的。 –

回答

4

此舉分配復位來定義和釋放,因此它本質上是這樣做的:

ref_to_value_of_0.reset(ref_to_value_of_0.release()) 

如果你的工作,這是怎麼評價你會發現它是一個安全的「無操作」。它釋放擁有的指針,釋放null,然後將其指針設置回原始值。

我不明白你爲什麼這麼做。

+0

我認爲這不等同,因爲這是一個舉動_assignment_,而不是移動構造函數。 –

+2

@SethCarnegie我知道。我爲移動任務寫了答案。 – Pubby

+0

但是,然後,移動分配操作假定他們正在管理兩個不同的指針,它會給它正在死的指針所擁有的指針,並讓它釋放它,不是嗎?除非它是專門用來處理自我移動的。 –