SORU
10 EKİM 2010, Pazar


shared_ptr sihirli :)

Mr. Lidström and me had an argument :)

Bay Lidström iddiası inşa a shared_ptr<Base> p(new Derived); Temel sanal bir yıkıcı olmasını gerektirmez

Armen Tsirunyan: "Gerçekten mi? Olacakshared_ptrdoğru temizlemek mi? Bu durumda bu yöndeki uygulanabilir gösterilmektedir misiniz?"

Daniel Lidström: "shared_ptrkendi yıkıcı Somut örneğini silmek için kullanır. Bu C toplum içinde DEMİRYOLU olarak bilinir. Benim tavsiyem DEMİRYOLU hakkında olabildiğince tüm öğrenin. Tüm durumlarda DEMİRYOLU kullandığınızda, C kodlama çok daha kolay hale getirecek."

Armen Tsirunyan: "DEMİRYOLU biliyorum, Ve ben de sonundashared_ptryıkıcı pn 0 ulaştığında saklı px silebilir. Ama eğer px Base statik tip işaretçi ve Base sanal bir yıkıcı olmadığı sürece 4**, o zaman dinamik türü işaretçi olsaydı, bu tanımsız davranışlara neden olur. Eğer yanılıyorsam beni düzeltin."

Daniel Lidström: "shared_ptrstatik tip Beton olduğunu bilir. Kurucusu ben öldüğünden beri bu bilir! Anlaşılan büyü gibi biraz, ama bir planıdır sizi temin ederim son derece güzel."

Bu yüzden bizi yargılama. Nasıl mümkün eğer varsa) uygulamaktırshared_ptrpolimorfik sınıfları sanal olması gerekmeden yıkıcı? Şimdiden teşekkürler

CEVAP
10 EKİM 2010, Pazar


Evet, mümkün shared_ptr bu şekilde uygulamak gerekiyor. Mu artıran ve önümüzdeki standart da bu davranışı gerektirir. İlave bir esneklik olarak shared_ptr daha sadece bir başvuru daha karşı yönetir. Sözde bir deleter genellikle de referans sayaçları içeren aynı bellek bloğu içine konur. Ama eğlenceli kısmı bu deleter türü shared_ptr türü bir parçası değildir. Bunun adı "türü silme" ve temelde aynı tekniği uygulamak için "polimorfik işlevleri" boost::fonksiyon veya std::function (C 0) gizlediği gerçek functor türü. Örnek çalışma yapmak için şablonu esas alan bir kurucu ihtiyacımız var:

template<class T>
class shared_ptr
{
public:
   ...
   template<class U>
   explicit shared_ptr(U* ptr);
   ...
};

Bu ve derslerin Temel kullanın ve Türetilmiş ...

class Base {};
class Derived : public Base {};

int main() {
   shared_ptr<Base> sp (new Derived);
}

... U ile şablon oluşturucu=Türetilmiş shared_ptr oluşturmak için kullanılan nesne. Yapıcı böylece uygun deleter nesne ve referans sayaçlar ve veri depolayan bir üyesi olarak bu denetim bloğu için bir işaretçi oluşturmak için şansı var. Eğer referans sayacı sıfıra ulaştığında, önceden oluşturulmuş ve Elde edilen farkında deleter nesne imha etmek için kullanılır.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Pepsi

    Pepsi

    1 Kasım 2005
  • Perihelion

    Perihelion

    23 NİSAN 2008
  • WOSU Public Media

    WOSU Public

    23 AĞUSTOS 2007