SORU
24 Mart 2009, Salı


Sil yıkıcı değil mi?

Bu alanlardan biri için yığın bellek ayırma kullanan bir sınıf (A) var. Bir sınıf başka bir sınıf içinde gösterici bir alan (B) örneği saklanır.

Nesne B ile işim bittiğinde, yıkıcı... Ama bu sınıf Bir yıkıcı de hitap ediyor çağırır, ki sanırım sil.

Düzenleme:

Cevaplar, alıyorum (yanlış varsa lütfen düzenleme):

  1. deleteB örneğiB::~aramaları B();
  2. A::~A(); çağırır
  3. and A::~Agerekiraçıkça delete-ayrılmış Bir yığın üye değişkenler;
  4. ve son olarak bir bellek bloğu saklama B örneği öbek - ne zaman döndü " dediyenikullanıldı, ilk olarak ayrılan bir blok bellek yığın, daha sonra çağrılan kurucular için başlatılamadı: bundan sonra tüm yıkıcı olmuştur çağrılan sonuçlandırmak için nesne blok nerede ikamet nesne döndürülür öbek.

CEVAP
24 Mart 2009, Salı


Bir yıkıcı, yaşamı boyunca çalışır. Belleğin serbest olmak istiyorum ve yıkıcı çalıştırın, eğer öbek üzerinde ayrılmış olsaydı silebilirsiniz. Eğer ayrılmış ise bu otomatik olarak (kapsam dışına çıktığında yani, DEMİRYOLU) olur yığını. Eğer bir sınıf (bir işaretçi değil, ama tam üye) üyesi ise, o zaman bu içeren nesne yok olduğunda gerçekleşir.

class A
{
    char *someHeapMemory;
public:
    A() : someHeapMemory(new char[1000]) {}
    ~A() { delete[] someHeapMemory; }
};

class B
{
    A* APtr;
public:
    B() : APtr(new A()) {}
    ~B() { delete APtr; }
};

class C
{
    A Amember;
public:
    C() : Amember() {}
    ~C() {} // A is freed / destructed automatically.
};

int main()
{
    B* BPtr = new B();
    delete BPtr; // Calls ~B() which calls ~A() 
    C *CPtr = new C();
    delete CPtr;
    B b;
    C c;
} // b and c are freed/destructed automatically

Yukarıdaki örnekte, her delete ve delete[] gereklidir. Ve silmek kullanmadım nerede ihtiyaç (ya da aslında kullanılan olabilir).

auto_ptr, unique_ptr shared_ptr vb... Bu yaşam yönetimi çok daha kolay yapmak için harika

class A
{
    shared_array<char> someHeapMemory;
public:
    A() : someHeapMemory(new char[1000]) {}
    ~A() { } // someHeapMemory is delete[]d automatically
};

class B
{
    shared_ptr<A> APtr;
public:
    B() : APtr(new A()) {}
    ~B() {  } // APtr is deleted automatically
};

int main()
{
    shared_ptr<B> BPtr = new B();
} // BPtr is deleted automatically

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • fufko

    fufko

    27 ŞUBAT 2006
  • SaMmM123

    SaMmM123

    3 Mayıs 2006
  • talkandroid

    talkandroid

    27 Mayıs 2010