2013-08-27 22 views
5
struct A final 
{ 
    int a; 

    void* operator new(size_t size) 
    { 
     // 
     // Is size always equal to sizeof(A) here? 
     // 
     return ::operator new(size); 
    } 

    void operator delete(void* ptr) 
    { 
     ::operator delete(ptr); 
    } 
}; 

int main() 
{ 
    for (auto i = 0; i < 100; i++) 
    { 
     delete new A; 
    } 
} 

Benim sorum da kodda yerleşiktir.Boyutlar A :: işleci new() işlevine her zaman eşittir (A)?

C++ standardı, A :: işleci new() 'e geçen boyutların her zaman aynı olmasını garanti ediyor mu?

Güncelleme: Burada A'nın sadece son sınıf olduğunu düşünün.

cevap

4

Alıntı, bölüm 5.3.4 noktası 10: Yeni bir ifade ilk bağımsız değişken olarak ayırma işlevi istenen boşluk miktarını geçer

std :: size_t türünde. argümanı, oluşturulmakta olan nesnenin boyutundan daha az olamaz; , yalnızca nesnesi bir dizi ise oluşturulmakta olan nesnenin boyutundan daha büyük olabilir.

Yani, evet, nesnenin boyutuyla aynı olması garanti edilir. Bununla birlikte, farklı derleyicilerin veya farklı derleyici seçeneklerinin, derleme zamanında belirli bir nesnenin gerçek boyutunu değiştirebileceğini unutmayın.

4

sayılı

Dene: Eğer

int main() 
{ 
    for (auto i = 0; i < 100; i++) 
    { 
     delete new A; 
     delete new B; 
    } 
} 

PS B oluştururken

struct B: public A 
{ 
    double a; 
} 

Şimdi yeni operatör onu görmek için bir baskı eklemek farklı bir boyut alacak:

O ıkış: C++ 11 standardından

> ./a.out 
S(4) 
S(12) 
S(4) 
S(12) 
S(4) 
+0

A son sınıf mı dersiniz? – xmllmx

+1

@xmllmx: C++ –

+0

'da böyle bir şey yok, lütfen yayını gözden geçirin. Onu revize ettim. Yapıyı final yapıyorum. – xmllmx

İlgili konular