Top 10 dumb mistakes to avoid with C++11 smart pointer okuyordum. Numara 5. okur:Tüm durumlarda, shared_ptr yapımı için ham işaretçiye neden izin verilir?
Hata # 5: oluşturulduğu kısa sürede gibi bir shared_ptr bir nesne (ham işaretçi) atama değil! hemen
Kullanım
make_shared
veyanew
ve onunla işaretçi inşa:int main() { Aircraft* myAircraft = new Aircraft("F-16"); shared_ptr<aircraft> pAircraft(myAircraft); ... shared_ptr<aircraft> p2(myAircraft); // will do a double delete and possibly crash }
ve öneri gibi bir şeydir.
Tamam, bu konuda hiçbir şüphe sorun ve öneri. Ancak ben shared_ptr
tasarımı hakkında bir sorum var. Bu çok kolay bir hata yapmak ve shared_ptr
tüm "güvenli" tasarımı çok kolay yanlışlıklar tarafından atılabilir.
Şimdi soru, bu kolayca ham işaretçi sadece yapıcı bir r-değeri referanstan olacaktır ki burada shared_ptr
alternatif bir tasarım ile sabit olabilir mı? Bu şekilde shared_ptr
yılında
template<class T>
struct shared_ptr{
shared_ptr(T*&& t){...basically current implementation...}
shared_ptr(T* t) = delete; // this is to...
shared_ptr(T* const& t) = delete; // ... illustrate the point.
shared_ptr(T*& t) = delete;
...
};
sadece new
sonucu ya da bazı fabrika işlevinden başlatıldı edilebilir. Bu kütüphanede C++ dilinin bir underexploitation
mi? veya ne ham işaretçi (l-değeri) referanstan bir kurucu sahip noktası bu büyük ihtimalle yanlış kullanımı olacak ise?
bu tarihsel rastlantı mıdır? (örneğin, r değeri referansları verilmeden önce paylaşılan_ptr önerildi, vb.) Geriye dönük uyumluluk?
(Tabi denebilir std::shared_ptr<type>(std::move(ptr));
o yakalamak için daha kolay ve ayrıca çalışma bu gerçekten gerekli mi etrafında eğer. Olduğunu)
Ben bir şey eksik?
İşaretçiler kopyalamak için kolay, ancak bir 'shared_ptr' için vardır. 'T * const' veya' T * & 'her ikisi de silinecektir, bu yüzden" tip uyuşmazlıkları "hakkındaki noktanızı anlamıyorum. (Ayrıca şablonda kesinti yapıcıda gerçekleşmez.) 'Make_shared' kullanımını sorgulamıyorum, aksine, bu onu kullanmaya teşvik ederdi. – alfC
Son olarak, yapıcısı yapmak gibi, ayrı bir çözüm gereken belki ayrı bir problem olarak görünüyor işlev çağırma atılan hariç senaryoda, ilgili noktayı anlamıyorum 'özel shared_ptr' ve bir arkadaşı işlevi zorlamak 'shared_ptr' oluşturmanın tek yolu 'make_shared'. – alfC
@alfC 'X * a = new X; X * b = a; shared_ptr (a); shared_ptr (b) 'Bu, işaretçi kopyası örneğidir. Veya X * a = yeni X olabilir; f (a) ' Shared_ptr (a) '' burada 'f (x * a_copy) {Shared_ptr (a_copy); } '. T && kurucu ile kısıtlama yapsak bile, sadece yukarıdaki kod, eskisi gibi derler ve başarısız olur. Hatalı eşleşmeler için –
Sorin