İle C ++ 17 , shared_ptr
dinamik olarak atanan diziyi yönetmek için kullanılabilir. shared_ptr
Bu durumda şablon argümanı olmalı T[N]
ya T[]
. Yani yazabilirsin
shared_ptr<int[]> sp(new int[10]);
N4659'dan [util.smartptr.shared.const]
template<class Y> explicit shared_ptr(Y* p);
Gereksinimler: Y
tam tip olmalıdır. İfadesi delete[] p
, ne zaman T
bir dizi türüdür veya delete p
zaman T
bir dizi türü değil, davranışı iyi tanımlanmış sahip olacaktır ve istisnalar atmak olmayacaktır.
...
Açıklamalar: zaman T
bir dizi türü ifade olmadıkça, bu yapıcı aşırı çözünürlük katılamaz delete[] p
iyi oluşturulmuş olan ve her iki T
olduğu U[N]
ve Y(*)[N]
dönüştürülebilen T*
ya da T
bir
U[]
ve Y(*)[]
dönüştürülebilen T*
. ...
Bunu desteklemek için üye türü element_type
şimdi
using element_type = remove_extent_t<T>;
Dizi öğelerine erişim operator[]
element_type& operator[](ptrdiff_t i) const;
Gerektirir: get() != 0 && i >= 0
. Eğer T
bir U[N]
, i < N
. ...
Notlar: Bir T
dizi türü olmadığında, bu üye işlevinin bildirilip bildirilmediği belirtilmez. Eğer ilan edilirse, fonksiyonun beyanının (mutlaka tanımı olmamasına rağmen) iyi bir şekilde oluşturulması dışında, dönüş türünün ne olduğu belirtilmemiştir.
Önceki C ++ 17 , shared_ptr
olabilir değil dinamik olarak ayrılmış dizilerini yönetmek için kullanılabilir. Varsayılan olarak, yönetilen nesneyi artık başvuru kalmadığında shared_ptr
çağırır delete
. Bununla birlikte, kullanarak ayırdığınızda , kaynağı boşaltmak için değil new[]
aramanız gerekir .delete[]
delete
shared_ptr
Bir diziyle doğru şekilde kullanabilmek için özel bir silici sağlamanız gerekir.
template< typename T >
struct array_deleter
{
void operator ()( T const * p)
{
delete[] p;
}
};
Shared_ptr dosyasını aşağıdaki gibi oluşturun:
std::shared_ptr<int> sp(new int[10], array_deleter<int>());
Şimdi yönetilen nesneyi yok ederken shared_ptr
doğru şekilde arayacaktır delete[]
.
Yukarıdaki özel silme ile değiştirilebilir
std::default_delete
Dizi türleri için kısmi uzmanlık
std::shared_ptr<int> sp(new int[10], std::default_delete<int[]>());
lambda ifadesi
std::shared_ptr<int> sp(new int[10], [](int *p) { delete[] p; });
Ayrıca, yönetilen nesnenin paylaşımına gerçekten ihtiyaç duymadığınız sürece, a unique_ptr
, dizi türleri için kısmi bir uzmanlığa sahip olduğundan bu görev için daha uygundur.
std::unique_ptr<int[]> up(new int[10]); // this will correctly call delete[]
C ++ Kütüphane Temelleri Uzantıları tarafından yapılan değişiklikler
Başka bir ön-C ++ tarafından sağlanan, yukarıda sıralananlara 17 Alternatif Kütüphane Temel Teknik Şartname artar, shared_ptr
bu nesneleri bir dizi sahip zaman durumlarda kutunun dışında çalışmasına izin vermek için. shared_ptr
Bu TS için geçerli değişikliklerin mevcut taslağı N4082'de bulunabilir . Bu değişikliklere std::experimental
ad alanı üzerinden erişilebilir ve <experimental/memory>
başlığa dahil edilir . shared_ptr
Dizileri desteklemeye yönelik ilgili değişikliklerden bazıları şunlardır:
- Üye türünün tanımı element_type
değişir
typedef T element_type;
typedef typename remove_extent<T>::type element_type;
- Üye operator[]
ekleniyor
element_type& operator[](ptrdiff_t i) const noexcept;
- farklı unique_ptr
diziler için kısmi uzmanlık, her ikisi de shared_ptr<T[]>
ve shared_ptr<T[N]>
geçerli olur ve hem de neden olur delete[]
nesnelerin idare dizi olarak adlandırılır.
template<class Y> explicit shared_ptr(Y* p);
Gereksinimler : Y
tam tip olmalıdır. İfade delete[] p
, ne zaman T
bir dizi türü, ya da delete p
zaman, T
bir dizi türü değil, iyi biçimli olacaktır iyi davranış tanımlanmış eder, ve kural dışı durumlar olmamalıdır. Tüm T
olup U[N]
, Y(*)[N]
dönüştürülebilir olacaktır T*
; zaman T
olduğu U[]
, Y(*)[]
dönüştürülebilir olacaktır T*
; aksi takdirde Y*
dönüştürülebilir olmalıdır T*
.
std::vector
. Diziyi, kopyaları oluşturmamak için referansları kullanarak geçirmeye dikkat etmelisiniz. Verilere erişmek için sözdizimi shared_ptr'den daha temizdir ve yeniden boyutlandırmak çok kolaydır. Ve eğer istersen bütün STL iyiliğini elde edersin.