Unique Pointers
In this lesson, we will examine the first type of smart pointer – the unique pointer. It limits access to its resource, thereby maintaining smart pointer's privacy.
Introduction
An std::unique_ptr automatically and exclusively manages the lifetime of its resource according to the RAII idiom. std::unique_ptr
should be our first choice since it functions without memory or performance overhead.
std::unique_ptr exclusively controls its resource. It automatically releases the resource if it goes out of scope. No copy semantics are required, and it can be used in containers and algorithms of the Standard Template Library. std::unique_ptr
is as cheap and fast as a raw pointer when no special delete function is used.
Characteristics
Before we go into the usage of std::unique_ptr
, here are its characteristics in a few bullet points.
The std::unique_ptr
:
- can be instantiated with and without a resource.
- manages the life cycle of a single object or an array of objects.
- transparently offers the interface of the underlying resource.
- can be parametrized with its own deleter function.
- can be moved (move semantics).
- can be created with the helper function
std::make_unique
.
Replacement for std::auto_ptr
⚠️ Don’t use std::auto_ptr
Classical C++98 has a smart pointerstd::auto_ptr
, which exclusively addresses the lifetime of a resource.std::auto_ptr
has a conceptual issue. If we implicitly or explicitly copy anstd::auto_ptr
, the resource is moved. Therefore, rather than utilizing copy semantic, we have a hidden move semantic, leading to undefined behavior. Sostd::auto_ptr
is deprecated in C++11 and removed in C++17. Instead, usestd::unique_ptr
. We can neither implicitly nor explicitly copy anstd::unique_ptr
; only moving it is possible.
Get hands-on with 1400+ tech skills courses.