SORU
25 EKİM 2012, PERŞEMBE


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
25 EKİM 2012, PERŞEMBE


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 T

 typedef 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. İfadesi delete[] p ne zaman T bir dizi yazın ya da delete 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ştirilebilir T*; T U[], Y(*)[] olacaktır. değiştirilebilir T*; aksi takdirde, Y* olacaktır. değiştirilebilir T*.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ben Schoon

    Ben Schoon

    23 Kasım 2012
  • hans peder sahl

    hans peder s

    22 Temmuz 2009
  • super1988guy

    super1988guy

    9 Aralık 2007