bir dizi shared_ptr : kullanılmalıdır?
Sadece shared_ptr
ile ilgili küçük bir sorgu.
İyi bir uygulama shared_ptr
bir dizi işaret kullanımı kolay mı?
e.g shared_ptr<int> sp(new int[10]);
Sonra birisi varsa lütfen söyle, neden? Zaten bir haberim var bir nedeni artış/shared_ptr
indirim. Bu nedenle bir dizi için normal bir işaretçi gibi kullanılamaz.
CEVAP
Varsayılan olarak, shared_ptr
başvuru için kalır yönetilen nesne üzerinde delete
arayacaktır. new[]
kullanarak ayrılamadı ancak delete[]
ve kaynak özgür delete
, araman gerekiyor.
Düzgün bir dizi shared_ptr
kullanmak için özel bir deleter sağlamalısınız.
template< typename T >
struct array_deleter
{
void operator ()( T const * p)
{
delete[] p;
}
};
Aşağıdaki gibi shared_ptr oluşturun
std::shared_ptr<int> sp( new int[10], array_deleter<int>() );
Şimdi shared_ptr
düzgün yönetilen nesne yok delete[]
arayacak.
Yorum gösterildiği gibi, C 11 array_deleter
yukarıda yerine dizi türleri için std::default_delete
kısmi uzmanlık kullanabilirsiniz.
std::shared_ptr<int> sp( new int[10], std::default_delete<int[]>() );
Ayrıca funktorlar yerine lambda ifade kullanabilirsiniz.
std::shared_ptr<int> sp( new int[10], []( int *p ) { delete[] p; } );
Aslında yönetilen nesne paylaşımı için gerekli olmadıkça, aynı zamanda, bir unique_ptr
dizi türleri için kısmi bir uzmanlaşma beri bu görev için uygundur.
std::unique_ptr<int[]> up( new int[10] ); // this will correctly call delete[]
Değişiklikler Kütüphane Temelleri için C Uzantıları tarafından kullanılmaya başlandı
shared_ptr
olmak artırılmış tarafından Kütüphanenin Temelleri Teknik Şartname (TS) için izin için çalışma kutudan için zaman zaman sahip olduğu bir nesneler dizisi; olacak gerek yok açıkça arz deleter. shared_ptr
değişiklikleri bu TS için planlanan mevcut taslak N4082 bulunabilir. Bu değişiklikler std::experimental
ad üzerinden erişilebilen ve <experimental/memory>
Başlığı eklenecektir. Diziler için shared_ptr
destek için ilgili değişiklikleri birkaçı:
&; üye türü tanımı element_type
değişiklikler -
element_type; typedef Ttypedef typename remove_extent<T>::type element_type;
- Üye operator[]
ilave ediliyor
element_type& operator[](ptrdiff_t i) const noexcept;
- Aksine unique_ptr
kısmi uzmanlaşma, diziler için, hem de shared_ptr<T[]>
shared_ptr<T[N]>
geçerli olur ve her ikisi de sonuç olarak delete[]
varlık olarak yönetilen nesneler dizisi.
template<class Y> explicit shared_ptr(Y* p);
Gerektirir:
Y
tam bir tür olacaktır. İfadesidelete[] p
ne zamanT
bir dizi yazın ya dadelete p
,T
bir dizi değil, yazın olacaktır iyi oluşmuş olacaktır iyi tanımlanmış davranış ve olmayacaktır atmak istisnalar.T
U[N]
,Y(*)[N]
olacaktır. değiştirilebilirT*
;T
U[]
,Y(*)[]
olacaktır. değiştirilebilirT*
; aksi takdirde,Y*
olacaktır. değiştirilebilirT*
.
Virgülle ayrılmış listesi içine Javasc...
Bir dizi önüne için en verimli şekilde...
Haskell Dizi.Hızlandırmak - forkOS hat...
Daha hızlı, iki dizi arasında benzersi...
Programlı C derleme zamanında statik b...