C++ 在唯一的_ptrc++;

C++ 在唯一的_ptrc++;,c++,pointers,memory-leaks,unique-ptr,C++,Pointers,Memory Leaks,Unique Ptr,我已经与unique\u ptr合作了几天,我对unique\u ptr的发布方法有疑问。我知道该版本返回“指向托管对象的指针,或者如果没有托管对象,则返回nullptr” 假设我们有三个唯一的\u ptr变量: unique_ptr< Node > left(Node); unique_ptr< Node > right(Node); unique_ptr< Node > middle(Node); 这会导致内存泄漏吗?存储release()返回的值,然后

我已经与
unique\u ptr
合作了几天,我对
unique\u ptr
的发布方法有疑问。我知道该版本返回“指向托管对象的指针,或者如果没有托管对象,则返回
nullptr

假设我们有三个
唯一的\u ptr
变量:

unique_ptr< Node > left(Node);
unique_ptr< Node > right(Node);
unique_ptr< Node > middle(Node);

这会导致内存泄漏吗?存储
release()
返回的值,然后使用它们是更好的方法还是这样可以

你在漏水<代码>释放使指针为空。您将丢失原始对象指针

您只需交换两次即可完成所需操作:

middle.swap(right);
right.swap(left);

你在漏水<代码>释放使指针为空。您将丢失原始对象指针

您只需交换两次即可完成所需操作:

middle.swap(right);
right.swap(left);
根据
release()
执行以下操作:

释放托管对象(如果有)的所有权。get()在调用后返回null ptr

因此,一旦您释放了所有对象,您就失去了指针!由于它们是由
unique_ptr
-s拥有的,它们现在在野外

相反,请使用swap小心地实现相同的目标:

right.swap(middle); // middle = right, right = middle
right.swap(left); // left = right = (old) middle, right = left
根据
release()
执行以下操作:

释放托管对象(如果有)的所有权。get()在调用后返回null ptr

因此,一旦您释放了所有对象,您就失去了指针!由于它们是由
unique_ptr
-s拥有的,它们现在在野外

相反,请使用swap小心地实现相同的目标:

right.swap(middle); // middle = right, right = middle
right.swap(left); // left = right = (old) middle, right = left

太棒了,我会接受这是最好的答案,让我:)什么?所以不要让提问者接受答案???@RustyX-有一个冷却期,15分钟IIRC。你不能在它过去之前接受。Wesome,我会接受这是最好的答案,让我:)什么?所以不要让提问者接受答案???@RustyX-有一个冷却期,15分钟IIRC。您不能在它通过之前接受。您可以在不释放的情况下调用
reset
。您可以在不释放的情况下调用
reset