std::unique_ptr<int> p1(new int); std::unique_ptr<int> p2(new int); p2=p1;
It seems here that p1 is no longer "unique" since p2 refer to it also
It is legal c++ ? Does unique_ptr have copy_semantics ? If no, and if it has only move semantics, is p1 set to NULL after assign it to p2 ?
EDIT:
ok so the correct version is
p2=std::move(p1)
According to that, after this assign, p1 is not valid ? And the difference with auto_ptr is here? it is more safe to explictly specfiy transfer of ownership than implicitly as it is the case with auto_ptr I guess
std::unique_ptr is a smart pointer that owns and manages another object through a pointer and disposes of that object when the unique_ptr goes out of scope. The object is disposed of, using the associated deleter when either of the following happens: the managing unique_ptr object is destroyed.
unique_ptr<> is one of the Smart pointer implementation provided by c++11 to prevent memory leaks. A unique_ptr object wraps around a raw pointer and its responsible for its lifetime. When this object is destructed then in its destructor it deletes the associated raw pointer.
Use unique_ptr when you want a single pointer to an object that will be reclaimed when that single pointer is destroyed. Use shared_ptr when you want multiple pointers to the same resource.
An explicit delete for a unique_ptr would be reset() . But do remember that unique_ptr are there so that you don't have to manage directly the memory they hold. That is, you should know that a unique_ptr will safely delete its underlying raw pointer once it goes out of scope.
Here is an article I wrote which answers your questions. I originally wrote this article to present an emulation of unique_ptr. However you can ignore the first few paragraphs dealing with the emulation and just start reading at "Basic Examples".
http://howardhinnant.github.io/unique_ptr03.html
Edit:
I had trouble distilling the above linked article down to something small enough to make a practical answer in this format. However here is my best shot:
The reason: Safety in generic code. One can not really make copies of either
auto_ptr
orunique_ptr
. Consider:template <class T> void foo(T t) { T copy_of_t = t; // line 4 assert(copy_of_t == t); }
It is not unusual at all for generic code to look like
foo
above. Theassert
is probably not actually there, but the assumption that theassert
would hold often is there ... implicitly. Indeed, a popular implementation ofstd::sort
had exactly this logic in 1996, which is exactly what prompted the secondauto_ptr
redesign (which helped, but didn't completely fix the problem).
std::unique_ptr is non-assignable and non-copyable. You need to use std::move();
so
p1 = std::move(p2);
Have a look here for more info.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With