2013-01-18 137 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

但是,然后,移动分配操作假定他们正在管理两个不同的指针,它会给它正在死的指针所拥有的指针,并让它释放它,不是吗?除非它是专门用来处理自我移动的。 –