SORU
7 Temmuz 2011, PERŞEMBE


GNU GCC (g ): Neden birden çok dtors oluşturur mu?

Geliştirme ortamı: GNU GCC (g ) 4.1.2

'Kod kapsamı - özellikle fonksiyon kapsamı' birim test, sınıf dtor bazıları birden çok kez oluşturulan gibi görünüyor fark ettik. artırmak için nasıl araştırmak için çalışırken ben Bazılarınız neden herhangi bir fikir var mı, lütfen?

Aşağıdaki kodu kullanarak yukarıda bahsettiğim şeyi denedim ve gözlenen.

"Testi.". h

class BaseClass
{
public:
    ~BaseClass();
    void someMethod();
};

class DerivedClass : public BaseClass
{
public:
    virtual ~DerivedClass();
    virtual void someMethod();
};

"" . Test.cpp içinde

#include <iostream>
#include "test.h"

BaseClass::~BaseClass()
{
    std::cout << "BaseClass dtor invoked" << std::endl;
}

void BaseClass::someMethod()
{
    std::cout << "Base class method" << std::endl;
}

DerivedClass::~DerivedClass()
{
    std::cout << "DerivedClass dtor invoked" << std::endl;
}

void DerivedClass::someMethod()
{
    std::cout << "Derived class method" << std::endl;
}

int main()
{
    BaseClass* b_ptr = new BaseClass;
    b_ptr->someMethod();
    delete b_ptr;
}

Yukarıdaki kodu (g test.cpp -o testi yaptım ve aşağıdaki gibi oluşturulmuş olan ne bakın

nm --demangle test

Aşağıdaki çıktıyı görebiliyordum.

==== following is partial output ====
08048816 T DerivedClass::someMethod()
08048922 T DerivedClass::~DerivedClass()
080489aa T DerivedClass::~DerivedClass()
08048a32 T DerivedClass::~DerivedClass()
08048842 T BaseClass::someMethod()
0804886e T BaseClass::~BaseClass()
080488f6 T BaseClass::~BaseClass()

Sorularım aşağıdaki gibidir.

1) birden fazla dtors üretilmedi Neden (- 2, BaseClass DerivedClass - 3)?

2) Bu dtors arasında Ne fark vardır? Bu birden fazla dtors seçime bağlı olarak kullanılacak?

Ben şimdi C proje için 100% fonksiyonu kapsama alanı elde etmek için, birim testleri bütün bu dtors çağırmak böylece ben bu anlamaya ihtiyacımız olacak gibi bir his var içimde.

Greately eğer birisi bana yukarıdaki cevap ver eğer seviniriz.

CEVAP
7 Temmuz 2011, PERŞEMBE


İlk olarak, bu işlevleri amaçları Itanium C ABI; tanımlar altında açıklanan "temel nesne yıkıcı", "", "yıkıcı". silme tam nesne yıkıcı Karıştırılmış adlarını eşleme 5.1.4'de verilmiştir.

Temel olarak:

  • D2 "temel nesne yıkıcı". Nesnenin kendisi olarak veri üyeleri ve sivil sanal temel sınıfları yok.
  • D1"". tam bir nesne yıkıcı Ayrıca sanal temel sınıfları yok.
  • D0 "nesne yıkıcı". silme Tam nesne yıkıcı yaptığı her şeyi yapar, operator delete aslında belleği boşaltmak için çağırır artı.

Eğer sanal temel sınıflar, D2 ve D1 varsa aynıdır; GCC, yeterli optimizasyonu düzeyde, aslında her ikisi için de aynı kodu semboller ad.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jordie Jordan

    Jordie Jorda

    27 Ocak 2008
  • Orson Wang

    Orson Wang

    28 EKİM 2006
  • Submissions101

    Submissions1

    23 ŞUBAT 2007