原始指针的unique_ptr :: reset的等效实现?

时间:2015-08-06 04:59:00

标签: c++ pointers smart-pointers unique-ptr

我正在尝试将一段代码重构为一个单独的对象/文件。为了保持相同的行为,我的代码需要使用指向原始文件中的关键组件的指针,这些组件被声明为unique_ptrs。

我正在考虑提取原始指针并将它们传递给我的对象,因为我的部分不负责删除任何指针。 (我希望我正确理解所有权语义,对C ++来说还是比较新的)。唯一需要注意的是我需要复制unique_ptr :: reset的行为。这个代码会重置同样的事情吗?

template <typename Type>
void reset(Type* &current_ptr){
       Type* old_ptr = current_ptr;
       current_ptr = new Type();
       if(old_ptr != null)
           delete old_ptr;
} 

2 个答案:

答案 0 :(得分:0)

如果您需要致电reset,那么 实际上实际上是删除了指针,并且在unique_ptr的析构函数的上下文之外这样做是要求灾难的食谱(即使你的代码看起来有效,它仍然可能是未定义的行为)。

如果实际上你需要的是取消引用(主要是*->unique_ptr那么你应该传递并使用引用来对象在新代码中,确保unique_ptr在您使用引用时无法死亡。

如果你需要重新分配或重置智能指针,你需要一种替代方法,但你没有在问题中提供足够的信息来帮助确定这种替代方法的范围。

答案 1 :(得分:0)

不,那不是reset()所做的。

正如评论中所指出的,智能指针的功能是关于所有权,而不是指针本身。所有权意味着责任,所以如果unique_ptr拥有一个对象,那就是它的工作&#34;在unique_ptr自行死亡时删除它。 shared_ptr稍微复杂一点,但它们也都是关于删除对象&#34;当时间到了#34;并且承担了你的责任,程序员。

unique_ptr是唯一的,也就是说,没有两个unique_ptr应该拥有相同的对象。

现在,reset()方法是一种说法&#34;嘿,unique_ptr,我有一个新指针供你管理,所以要销毁旧指针(如果你有任何)并取得我给你的这个新的所有权。从现在开始,这是你在自己死的时候会摧毁的那个。&#34;

此操作与原始指针没有任何意义,因为它们不拥有任何所有权,并且不会在正确的时间或类似的情况下自行解雇。

因此,将它与您的代码进行比较,相似之处在于确实删除了旧指针。但是除了缺失的本质(也就是说,原始指针不记得删除自己并且不拥有所有权),正常的reset()被赋予一个指针,它不会创建一个新的对象本身。