unique_ptr
Sınıf
Sahip olunan bir nesne veya diziye yönelik bir işaretçi depolar. Nesne/dizi başka unique_ptr
hiç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_t
bir rvalue
.
Ptr
Bir pointer
.
Deleter
öğesine deleter
bağlı bir unique_ptr
işlev.
Özel durumlar
tarafından unique_ptr
hiçbir özel durum oluşturulmaz.
Açıklamalar
unique_ptr
sınıfı öğesinin yerini alır auto_ptr
ve C++ Standart Kitaplık kapsayıcılarının öğesi olarak kullanılabilir.
make_unique
yeni örneklerini unique_ptr
verimli 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_ptr
bir 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 new
ayrıldığını ve çağrılarak delete _Ptr
serbest 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[] ptr
için özelleştirilmiş olan .)
Sahip olunan bir kaynağın depolanan işaretçisi stored_ptr
türüne pointer
sahiptir. 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_ptr yedi oluşturucu vardır. |
Tür tanımları
Veri Akışı Adı | Açıklama |
---|---|
deleter_type |
şablon parametresinin Del eş anlamlısı. |
element_type |
şablon parametresinin T eş 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_deleter dö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_ptr ile değiştirir. |
İşleçler
Veri Akışı Adı | Açıklama |
---|---|
operator bool |
işleci, türüne dönüştürülebilir bool bir 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-type değerini unique_ptr atar. |
deleter_type
türü, şablon parametresi Del
için bir eş anlamlıdır.
typedef Del deleter_type;
Açıklamalar
türü, şablon parametresi Del
için bir eş anlamlıdır.
element_type
türü, şablon parametresi Type
için bir eş anlamlıdır.
typedef Type element_type;
Açıklamalar
türü, şablon parametresi Ty
iç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_deleter
döndürür.
Del& get_deleter();
const Del& get_deleter() const;
Açıklamalar
Üye işlevi öğesine stored_deleter
bir 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_deleter
gidinright.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 nullptr
ayarlar.
pointer release();
Açıklamalar
tarafından unique_ptr
depolanan 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 release
sonra öğ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 nullptr
ayarlar.
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 ptr
depolayı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_deleter
değiştirilirstored_ptr
.
unique_ptr
için unique_ptr
yedi 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_ptr
iş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_ptr
depolar. Dördüncü oluşturucu ve içinde stored_ptr
deleter
stored_deleter
depolar.ptr
Beşinci oluşturucu içinde stored_ptr
depolar ptr
ve içine stored_deleter
taşınırdeleter
. Altıncı ve yedinci oluşturucular içinde depolar right.release()
ve içine stored_deleter
taşınırright.get_deleter()
.stored_ptr
~unique_ptr
için unique_ptr
yıkıcı bir unique_ptr
nesneyi yok eder.
~unique_ptr();
Açıklamalar
Yok edici çağrısında bulunur get_deleter()(stored_ptr)
.