我正在尝试将一段代码重构为一个单独的对象/文件。为了保持相同的行为,我的代码需要使用指向原始文件中的关键组件的指针,这些组件被声明为unique_ptrs。
我正在考虑提取原始指针并将它们传递给我的对象,因为我的部分不负责删除任何指针。 (我希望我正确理解所有权语义,对C ++来说还是比较新的)。唯一需要注意的是我需要复制unique_ptr :: reset的行为。这个代码会重置同样的事情吗?
template <typename Type>
void reset(Type* ¤t_ptr){
Type* old_ptr = current_ptr;
current_ptr = new Type();
if(old_ptr != null)
delete old_ptr;
}
答案 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()
被赋予一个指针,它不会创建一个新的对象本身。