SORU
17 HAZİRAN 2010, PERŞEMBE


Bir yıkıcı özyinelemeli olabilir?

Bu program tanımlı peki, neden tam değil?

#include <iostream>
#include <new>
struct X {
    int cnt;
    X (int i) : cnt(i) {}
    ~X() {  
            std::cout << "destructor called, cnt=" << cnt << std::endl;
            if ( cnt-- > 0 )
                this->X::~X(); // explicit recursive call to dtor
    }
};
int main()
{   
    char* buf = new char[sizeof(X)];
    X* p = new(buf) X(7);
    p->X::~X();  // explicit call to dtor
    delete[] buf;
}

Benim akıl: invoking a destructor twice is undefined behavior, ne diyor 12.4/14, başına tam olarak bu: rağmen

bu davranış, eğer tanımlı değil yıkıcı bir nesne için çağrılır sona eren

Özyinelemeli aramaları yasakla görünmüyor. Bir nesne için yıkıcı yürütülürken, nesnenin ömrü İK yıkıcı tekrar çağırmak için değil böylece henüz sona ermiştir. Diyor ki: öte yandan, 12.4/6

Vücut yürüttükten sonra [...] "X" sınıfı aramaları için yıkıcı X doğrudan üyeleri için yıkıcı, X doğrudan temel için yıkıcılar [ ... ] sınıflar

yani bundan sonra geri gelen bir özyinelemeli çağırma bir yıkıcı, tüm üye ve temel sınıf yıkıcı olacak alındığını ve arama onları bir daha ne zaman dönmeden önceki seviye özyineleme olurdu İK. Bu nedenle, temel bir sınıf ve sadece POD üyeleri İK olmadan özyinelemeli bir yıkıcı olabilir. Haksız mıyım?

CEVAP
17 HAZİRAN 2010, PERŞEMBE


Cevap "hayır," " §3.8/1: . ömür boyu tanımı nedeniyle

Türünde bir nesne ömrü T biter:

T önemsiz olmayan bir yıkıcı bir sınıf türü (12.4) ise, yıkıcı aramayı başlatır

— nesneyi kaplar depolama ya da yeniden serbest bırakılır.

Yıkıcı denir (ilk kez) en kısa sürede, nesnenin ömrü sona erdi. Eğer yıkıcı içinde nesnenin yıkıcı ararsan böylece, davranışı tanımsız, §12.4/6 başına

bu davranış, eğer yıkıcı sona eren bir nesne için çağrıldığında tanımlı değil

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FRED

    FRED

    1 EKİM 2005
  • MrOctopi

    MrOctopi

    6 Aralık 2010
  • Ryan Billy

    Ryan Billy

    30 EKİM 2006