Bewerken

Delen via


unique_ptr Class

Stores a pointer to an owned object or array. The object/array is owned by no other unique_ptr. The object/array is destroyed when the unique_ptr is destroyed.

Syntax

class unique_ptr {
public:
    unique_ptr();
    unique_ptr(nullptr_t Nptr);
    explicit unique_ptr(pointer Ptr);
    unique_ptr(pointer Ptr,
        typename conditional<is_reference<Del>::value, Del,
        typename add_reference<const Del>::type>::type Deleter);
    unique_ptr(pointer Ptr,
        typename remove_reference<Del>::type&& Deleter);
    unique_ptr(unique_ptr&& Right);
    template <class T2, Class Del2>
    unique_ptr(unique_ptr<T2, Del2>&& Right);
    unique_ptr(const unique_ptr& Right) = delete;
    unique_ptr& operator=(const unique_ptr& Right) = delete;
};

//Specialization for arrays:
template <class T, class D>
class unique_ptr<T[], D> {
public:
    typedef pointer;
    typedef T element_type;
    typedef D deleter_type;
    constexpr unique_ptr() noexcept;
    template <class U>
    explicit unique_ptr(U p) noexcept;
    template <class U>
    unique_ptr(U p, see below d) noexcept;
    template <class U>
    unique_ptr(U p, see below d) noexcept;
    unique_ptr(unique_ptr&& u) noexcept;
    constexpr unique_ptr(nullptr_t) noexcept : unique_ptr() { }     template <class U, class E>
        unique_ptr(unique_ptr<U, E>&& u) noexcept;
    ~unique_ptr();
    unique_ptr& operator=(unique_ptr&& u) noexcept;
    template <class U, class E>
    unique_ptr& operator=(unique_ptr<U, E>&& u) noexcept;
    unique_ptr& operator=(nullptr_t) noexcept;
    T& operator[](size_t i) const;

    pointer get() const noexcept;
    deleter_type& get_deleter() noexcept;
    const deleter_type& get_deleter() const noexcept;
    explicit operator bool() const noexcept;
    pointer release() noexcept;
    void reset(pointer p = pointer()) noexcept;
    void reset(nullptr_t = nullptr) noexcept;
    template <class U>
    void reset(U p) noexcept = delete;
    void swap(unique_ptr& u) noexcept;  // disable copy from lvalue unique_ptr(const unique_ptr&) = delete;
    unique_ptr& operator=(const unique_ptr&) = delete;
};

Parameters

Right
A unique_ptr.

Nptr
An rvalue of type std::nullptr_t.

Ptr
A pointer.

Deleter
A deleter function that is bound to a unique_ptr.

Exceptions

No exceptions are generated by unique_ptr.

Remarks

The unique_ptr class supersedes auto_ptr, and can be used as an element of C++ Standard Library containers.

Use the make_unique helper function to efficiently create new instances of unique_ptr.

unique_ptr uniquely manages a resource. Each unique_ptr object stores a pointer to the object that it owns or stores a null pointer. A resource can be owned by no more than one unique_ptr object; when a unique_ptr object that owns a particular resource is destroyed, the resource is freed. A unique_ptr object may be moved, but not copied; for more information, see Rvalue Reference Declarator: &&.

The resource is freed by calling a stored deleter object of type Del that knows how resources are allocated for a particular unique_ptr. The default deleter default_delete<T> assumes that the resource pointed to by ptr is allocated with new, and that it can be freed by calling delete _Ptr. (A partial specialization unique_ptr<T[]>manages array objects allocated with new[], and has the default deleter default_delete<T[]>, specialized to call delete[] ptr.)

The stored pointer to an owned resource, stored_ptr has type pointer. It's Del::pointer if defined, and T * if not. The stored deleter object stored_deleter occupies no space in the object if the deleter is stateless. Note that Del can be a reference type.

Members

Constructors

Name Description
unique_ptr There are seven constructors for unique_ptr.

Typedefs

Name Description
deleter_type A synonym for the template parameter Del.
element_type A synonym for the template parameter T.
pointer A synonym for Del::pointer if defined, otherwise T *.

Functions

Name Description
get Returns stored_ptr.
get_deleter Returns a reference to stored_deleter.
release stores pointer() in stored_ptr and returns its previous contents.
reset Releases the currently owned resource and accepts a new resource.
swap Exchanges resource and deleter with the provided unique_ptr.

Operators

Name Description
operator bool The operator returns a value of a type that is convertible to bool. The result of the conversion to bool is true when get() != pointer(), otherwise false.
operator-> The member function returns stored_ptr.
operator* The member function returns *stored_ptr.
operator= Assigns the value of a unique_ptr (or a pointer-type) to the current unique_ptr.

deleter_type

The type is a synonym for the template parameter Del.

typedef Del deleter_type;

Remarks

The type is a synonym for the template parameter Del.

element_type

The type is a synonym for the template parameter Type.

typedef Type element_type;

Remarks

The type is a synonym for the template parameter Ty.

get

Returns stored_ptr.

pointer get() const;

Remarks

The member function returns stored_ptr.

get_deleter

Returns a reference to stored_deleter.

Del& get_deleter();

const Del& get_deleter() const;

Remarks

The member function returns a reference to stored_deleter.

operator=

Assigns the address of the provided unique_ptr to the current one.

unique_ptr& operator=(unique_ptr&& right);
template <class U, Class Del2>
unique_ptr& operator=(unique_ptr<Type, Del>&& right);
unique_ptr& operator=(pointer-type);

Parameters

A unique_ptr reference used to assign the value of to the current unique_ptr.

Remarks

The member functions call reset(right.release()) and move right.stored_deleter to stored_deleter, then return *this.

pointer

A synonym for Del::pointer if defined, otherwise Type *.

typedef T1 pointer;

Remarks

The type is a synonym for Del::pointer if defined, otherwise Type *.

release

Releases ownership of the returned stored pointer to the caller and sets the stored pointer value to nullptr.

pointer release();

Remarks

Use release to take over ownership of the raw pointer stored by the unique_ptr. The caller is responsible for deletion of the returned pointer. The unique-ptr is set to the empty default-constructed state. You can assign another pointer of compatible type to the unique_ptr after the call to release.

Example

This example shows how the caller of release is responsible for the object returned:

// stl_release_unique.cpp
// Compile by using: cl /W4 /EHsc stl_release_unique.cpp
#include <iostream>
#include <memory>

struct Sample {
   int content_;
   Sample(int content) : content_(content) {
      std::cout << "Constructing Sample(" << content_ << ")" << std::endl;
   }
   ~Sample() {
      std::cout << "Deleting Sample(" << content_ << ")" << std::endl;
   }
};

void ReleaseUniquePointer() {
   // Use make_unique function when possible.
   auto up1 = std::make_unique<Sample>(3);
   auto up2 = std::make_unique<Sample>(42);

   // Take over ownership from the unique_ptr up2 by using release
   auto ptr = up2.release();
   if (up2) {
      // This statement does not execute, because up2 is empty.
      std::cout << "up2 is not empty." << std::endl;
   }
   // We are now responsible for deletion of ptr.
   delete ptr;
   // up1 deletes its stored pointer when it goes out of scope.
}

int main() {
   ReleaseUniquePointer();
}
Constructing Sample(3)
Constructing Sample(42)
Deleting Sample(42)
Deleting Sample(3)

reset

Takes ownership of the pointer parameter, and then deletes the original stored pointer. If the new pointer is the same as the original stored pointer, reset deletes the pointer and sets the stored pointer to nullptr.

void reset(pointer ptr = pointer());
void reset(nullptr_t ptr);

Parameters

ptr
A pointer to the resource to take ownership of.

Remarks

Use reset to change the stored pointer owned by the unique_ptr to ptr and then delete the original stored pointer. If the unique_ptr wasn't empty, reset invokes the deleter function returned by get_deleter on the original stored pointer.

Because reset first stores the new pointer ptr, and then deletes the original stored pointer, it's possible for reset to immediately delete ptr if it's the same as the original stored pointer.

swap

Exchanges pointers between two unique_ptr objects.

void swap(unique_ptr& right);

Parameters

right
A unique_ptr used to swap pointers.

Remarks

The member function swaps stored_ptr with right.stored_ptr and stored_deleter with right.stored_deleter.

unique_ptr

There are seven constructors for unique_ptr.

unique_ptr();

unique_ptr(nullptr_t);
explicit unique_ptr(pointer ptr);

unique_ptr(
    Type* ptr,
    typename conditional<
    is_reference<Del>::value,
    Del,
    typename add_reference<const Del>::type>::type _Deleter);

unique_ptr(pointer ptr, typename remove_reference<Del>::type&& _Deleter);
unique_ptr(unique_ptr&& right);
template <class Ty2, Class Del2>
    unique_ptr(unique_ptr<Ty2, Del2>&& right);

Parameters

ptr
A pointer to the resource to be assigned to a unique_ptr.

_Deleter
A deleter to be assigned to a unique_ptr.

right
An rvalue reference to a unique_ptr from which unique_ptr fields are move assigned to the newly constructed unique_ptr.

Remarks

The first two constructors construct an object that manages no resource. The third constructor stores ptr in stored_ptr. The fourth constructor stores ptr in stored_ptr and deleter in stored_deleter.

The fifth constructor stores ptr in stored_ptr and moves deleter into stored_deleter. The sixth and seventh constructors store right.release() in stored_ptr and moves right.get_deleter() into stored_deleter.

~unique_ptr

The destructor for unique_ptr, destroys a unique_ptr object.

~unique_ptr();

Remarks

The destructor calls get_deleter()(stored_ptr).