Aracılığıyla paylaş


unique_ptr Sınıf

Sahip olunan bir nesne veya diziye yönelik bir işaretçi depolar. Nesne/dizi başka unique_ptrhiçbir öğesine ait değildir. nesnesi/dizisi yok edildiğinde unique_ptr yok edilir.

Sözdizimi

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;
};

Parametreler

Right
Bir unique_ptr.

Nptr
türünde std::nullptr_tbir rvalue .

Ptr
Bir pointer.

Deleter
öğesine deleter bağlı bir unique_ptrişlev.

Özel durumlar

tarafından unique_ptrhiçbir özel durum oluşturulmaz.

Açıklamalar

unique_ptr sınıfı öğesinin yerini alır auto_ptrve C++ Standart Kitaplık kapsayıcılarının öğesi olarak kullanılabilir.

make_unique yeni örneklerini unique_ptrverimli bir şekilde oluşturmak için yardımcı işlevini kullanın.

unique_ptr bir kaynağı benzersiz bir şekilde yönetir. Her unique_ptr nesne, sahip olduğu nesnenin işaretçisini depolar veya null bir işaretçi depolar. Bir kaynak birden unique_ptr fazla nesneye ait olamaz; belirli bir kaynağa sahip olan bir unique_ptr nesne yok edildiğinde kaynak serbest olur. Bir unique_ptr nesne taşınabilir, ancak kopyalanamaz; daha fazla bilgi için bkz . Rvalue Başvuru Bildirimcisi: &&.

Kaynak, kaynakların belirli unique_ptrbir için nasıl ayrıldığını Del bilen türde bir saklı deleter nesne çağrılarak serbest bırakıldı. Varsayılan değer deleter default_delete<T> , tarafından ptr işaret edilen kaynağın ile newayrıldığını ve çağrılarak delete _Ptrserbest edilebileceğini varsayar. (Kısmi özelleştirmeunique_ptr<T[]>, ile new[]ayrılan dizi nesnelerini yönetir ve varsayılan default_delete<T[]>deleter olarak çağrısı delete[] ptriçin özelleştirilmiş olan .)

Sahip olunan bir kaynağın depolanan işaretçisi stored_ptr türüne pointersahiptir. Tanımlandıysa Del::pointer ve T * tanımlanmadıysa. durum bilgisi yoksadeleter, depolanan deleter nesne stored_deleter nesnede yer kaplamaz. Del Bunun bir başvuru türü olabileceğini unutmayın.

Üyeler

Oluşturucular

Veri Akışı Adı Açıklama
unique_ptr için unique_ptryedi oluşturucu vardır.

Tür tanımları

Veri Akışı Adı Açıklama
deleter_type şablon parametresinin Deleş anlamlısı.
element_type şablon parametresinin Teş anlamlısı.
pointer Tanımlanmışsa için Del::pointer bir eş anlamlı, aksi takdirde T *.

İşlevler

Veri Akışı Adı Açıklama
get stored_ptr döndürür.
get_deleter öğesine bir başvuru stored_deleterdöndürür.
release içinde stored_ptr depolar pointer() ve önceki içeriğini döndürür.
reset Şu anda sahip olunan kaynağı yayınlar ve yeni bir kaynağı kabul eder.
swap Kaynağı ve deleter sağlanan unique_ptrile değiştirir.

İşleçler

Veri Akışı Adı Açıklama
operator bool işleci, türüne dönüştürülebilir boolbir değer döndürür. dönüştürme bool işleminin sonucu olduğunda get() != pointer()elde edilirtrue, aksi takdirde false.
operator-> Üye işlevi döndürür stored_ptr.
operator* Üye işlevi döndürür *stored_ptr.
operator= Geçerli unique_ptröğesine (veya ) pointer-typedeğerini unique_ptr atar.

deleter_type

türü, şablon parametresi Deliçin bir eş anlamlıdır.

typedef Del deleter_type;

Açıklamalar

türü, şablon parametresi Deliçin bir eş anlamlıdır.

element_type

türü, şablon parametresi Typeiçin bir eş anlamlıdır.

typedef Type element_type;

Açıklamalar

türü, şablon parametresi Tyiçin bir eş anlamlıdır.

get

stored_ptr döndürür.

pointer get() const;

Açıklamalar

Üye işlevi döndürür stored_ptr.

get_deleter

öğesine bir başvuru stored_deleterdöndürür.

Del& get_deleter();

const Del& get_deleter() const;

Açıklamalar

Üye işlevi öğesine stored_deleterbir başvuru döndürür.

operator=

Sağlanan unique_ptr adresini geçerli adrese atar.

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

Parametreler

unique_ptr değerini geçerli unique_ptröğesine atamak için kullanılan başvuru.

Açıklamalar

Üye işlevleri çağrısı reset(right.release()) yapıp öğesine stored_deletergidinright.stored_deleter, ardından döndürür*this.

pointer

Tanımlanmışsa için Del::pointer bir eş anlamlı, aksi takdirde Type *.

typedef T1 pointer;

Açıklamalar

Türü, tanımlanmışsa için Del::pointer bir eş anlamlıdır, aksi takdirde Type *.

release

Döndürülen depolanmış işaretçinin sahipliğini çağıranı serbest bırakır ve depolanan işaretçi değerini olarak nullptrayarlar.

pointer release();

Açıklamalar

tarafından unique_ptrdepolanan ham işaretçinin sahipliğini devralmak için kullanınrelease. Çağıran, döndürülen işaretçinin silinmesinden sorumludur. unique-ptr, boş varsayılan olarak oluşturulduğunda durumuna ayarlanır. çağrısından releasesonra öğesine unique_ptr uyumlu türde başka bir işaretçi atayabilirsiniz.

Örnek

Bu örnek, yayın çağıranın döndürülen nesneden nasıl sorumlu olduğunu gösterir:

// 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

İşaretçi parametresinin sahipliğini alır ve özgün depolanan işaretçiyi siler. Yeni işaretçi özgün depolanan işaretçiyle aynıysa, reset işaretçiyi siler ve depolanan işaretçiyi olarak nullptrayarlar.

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

Parametreler

ptr
Sahipliğini almak için kaynağın işaretçisi.

Açıklamalar

öğesinin sahip olduğu unique_ptr depolanmış pointer öğeyi ptr olarak değiştirmek ve ardından özgün depolanan işaretçiyi silmek için kullanınreset. unique_ptr boş değilse, reset tarafından döndürülen get_deleter deleter işlevini özgün depolanmış işaretçide çağırır.

İlk olarak reset yeni işaretçiyi ptrdepolayıp özgün depolanmış işaretçiyi sildiğinden, özgün depolanan işaretçiyle aynıysa hemen silmek ptr mümkündürreset.

swap

İşaretçileri iki unique_ptr nesne arasında değiştirir.

void swap(unique_ptr& right);

Parametreler

right
İşaretçileri unique_ptr değiştirmek için kullanılan.

Açıklamalar

Üye işlevi ile right.stored_ptr ve stored_deleter ile right.stored_deleterdeğiştirilirstored_ptr.

unique_ptr

için unique_ptryedi oluşturucu vardır.

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);

Parametreler

ptr
bir öğesine atanacak kaynağa ilişkin bir unique_ptrişaretçi.

_Deleter
A'ya deleter atanacak unique_ptr.

right
rvalue reference unique_ptr Yeni inşa edilen unique_ptr unique_ptröğesine alanların atandığı bir öğesine.

Açıklamalar

İlk iki oluşturucu hiçbir kaynağı yönetmez bir nesne oluşturur. Üçüncü oluşturucu ptr'yi içinde stored_ptrdepolar. Dördüncü oluşturucu ve içinde stored_ptr deleter stored_deleterdepolar.ptr

Beşinci oluşturucu içinde stored_ptr depolar ptr ve içine stored_deletertaşınırdeleter. Altıncı ve yedinci oluşturucular içinde depolar right.release() ve içine stored_deletertaşınırright.get_deleter().stored_ptr

~unique_ptr

için unique_ptryıkıcı bir unique_ptr nesneyi yok eder.

~unique_ptr();

Açıklamalar

Yok edici çağrısında bulunur get_deleter()(stored_ptr).