SORU
22 HAZİRAN 2009, PAZARTESİ


Bir '' yıkıcı boş oluşturulan yıkıcı olarak aynı şeyi yapacağız?

(Oyuncak) aşağıdaki gibi: C sınıfı diyebiliriz

class Foo {
    public:
        Foo();
    private:
        int t;
};

Hiçbir yıkıcı tanımlandığından, bir C derleyici otomatik olarak bir sınıf Foo için oluşturmanız gerekir. Eğer yıkıcı dinamik olarak ayrılan bellek (makul derleyici bize verir yıkıcı güvendik) temizlemek gerekiyor mu yoksa boş bir yıkıcı belirleyici olacak, yani.

Foo::~Foo() { }

derleyici tarafından oluşturulan bir aynı şeyi mi yapıyorsun?

Eğer farklılıklar varsa, nerede var? Bir diğer yöntem tercih edilir.

EDİT: Cevap kurucular için de aynı mı?

CEVAP
22 HAZİRAN 2009, PAZARTESİ


Aynı şeyi (şey, aslında). Eğer yazmadın bile aynı değil. Yıkıcı yazma temel sınıf yıkıcı bir çalışma gerektirir çünkü. Eğer temel sınıf yıkıcı özelse veya çağrılabilir mi başka bir nedeni varsa, o zaman program hatalı. Bu göz önünde bulundurun

struct A { private: ~A(); };
struct B : A { };

Yani TAMAM, sürece sakın gerektirecek imha nesne B tipi (ve böylece, dolaylı olarak tip A) - istersen hiç aramıyorsun sil bir dinamik olarak oluşturulan nesne, ya da hiç bir nesne oluşturma içinde ilk yer. Eğer bunu yaparsanız, derleyici uygun bir tanı gösterecektir. Şimdi eğer biri açıkça sağlamak

struct A { private: ~A(); };
struct B : A { ~B() { /* ... */ } };

Bu bir örtülü olarak temel sınıf yıkıcı aramak için çalışacağız, ve zaten ~B tanımı zamanda bir tanı neden olur.

Üye yıkıcılar için yıkıcı ve örtülü aramalar tanımı etrafında dönen başka bir fark yoktur. Bu akıllı işaretçi üyesi düşünün

struct C;
struct A {
    auto_ptr<C> a;
    A();
};

Hadi C da yapı tanımını içeren .cpp dosyasında private tanımı oluşturulur tür nesne C varsayalım. Eğer 15 ** A bir nesnenin imha gerektiren yapı kullanırsanız, derleyici yıkıcı, sadece yukarıdaki örnekte olduğu gibi üstü kapalı bir tanımını getirir. Bu yıkıcı da dolaylı olarak auto_ptr nesnesinin yıkıcı arayacak. Ve bu tutar, C nesneye işaret eden bir işaretçi C tanımını bilmeden silecektir! Bu yapı private tanımlandığı .cpp dosyasında ortaya çıktı.

Bu aslında pimpl deyimi uygulamada sık görülen bir sorundur. Çözüm burada bir yıkıcı eklemek ve yapı C tanımlandığı .cpp dosyası boş bir tanım vermektedir. Üye yıkıcı çağırır zamanda, yapı tanımı 22 ** ve doğru kendi yıkıcı arayabilir biliyor.

struct C;
struct A {
    auto_ptr<C> a;
    A();
    ~A(); // defined as ~A() { } in .cpp file, too
};

boost::shared_ptr böyle bir sorun yok not: Bunun yerine kurucusu belli şekilde çağrıldığında tam bir türü gerektirir.

Geçerli bir fark yaratıyor başka bir nokta C kullanıcı yıkıcı ilan etti böyle bir nesne üzerinde memset ve arkadaşlar kullanmak istediğinizde. Bu tip Bakla artık değil (plain old data), ve bu bit kopyalanması yasaktır. Unutmayın bu bir kısıtlama değil gerçekten gerekli ve bir sonraki C sürümü geliştirilmiş durum bu, böylece tanır sana hala bit kopyalama gibi türleri sürece, diğer daha önemli bir değişiklik yapılmış değil.

< / ^ hr .

Kurucular için sorduğun için: Peki, bunlar için de aynı şeyler geçerli. Kurucular da yıkıcı örtülü çağrıları içeren not. Şeyler gibi auto_ptr, bu çağrılar (bile değil aslında yaptığı çalışma zamanı - saf olasılığı zaten önemli olan Burada) aynı zarar için yıkıcılar, ve ne zaman bir şeye kurucu atar - derleyici o zaman gerekli için arama yıkıcı üyeleri. This answer varsayılan kurucular örtülü tanımı bazı kullanır.

Ayrıca, aynı görüş için gerçek ve yıkıcı hakkında söylediğim PODness üzerindedir.

Tek önemli fark başlatılması ile ilgili. Kullanıcı kurucu ilan koyarsanız, senin yazın üyelerinin değer başlatma almaz

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Microsoft Research

    Microsoft Re

    24 EKİM 2008
  • Numberphile

    Numberphile

    15 EYLÜL 2011
  • World Science Festival

    World Scienc

    1 Mayıs 2008