Unique ownership
12345678910111213 | #include <memory>
#include <utility>
struct foo {};
void func(std::unique_ptr<foo> obj)
{ }
int main()
{
std::unique_ptr<foo> obj = std::make_unique<foo>();
func(std::move(obj));
} |
This pattern is licensed under the CC0 Public Domain Dedication.
Intent
Transfer unique ownership of a dynamically allocated object to another unit of code.
Description
On line 11, we create a std::unique_ptr
which has ownership of a dynamically allocated foo
object
(created with the std::make_unique
utility function). Line 12 then demonstrates passing ownership of this
object to the function func
. After passing ownership, main
no
longer has access to the foo
object.
As std::unique_ptr
is non-copyable, it must be moved instead of
being copied. The call to std::move
on line 12
allows obj
to be treated like a temporary object (the expression
std::move(obj)
is an rvalue) so that it can be moved into the
function.
In other cases, you may instead wish to share ownership of an object.
Note: std::make_unique
was introduced in C++14. For C++11,
you can roll your own implementation.