2015-12-18 30 views
12

C++ bellek ayırma işleci, operator new (size_t s) biçimindedir. T türünde bir sınıf nesnesi için new işlecini aşırı yüklediğimde, işleci new giriş argümanının (yani size_t s) tam olarak sizeof(T) olduğunu garanti eder mi? Evet ise, bu işlev neden giriş argümanı olarak büyüklüğüne ihtiyaç duyuyor?C++ yükleme sırasında boyut bilgileri yeni operatör

+0

Bu benim alanım değil, fakat [this] (http://en.cppreference.com/w/cpp/memory/new/operator_new) yardımcı olabilir. – hargasinski

cevap

13

Bir temel sınıftaki yeni operatörü geçersiz kılmak ve türetilmiş sınıf türündeki nesneleri ayırmak için kullanmak mümkündür.

struct Base 
{ 
    void* operator new (size_t s) { ... } 
    int a; 
}; 

struct Derived : public Base 
{ 
    int b; 
}; 

Derived* d = new Derived; 

Derived için bellek ayrılırken, Base::operator new(size_t) kullanılacaktır. Argümanın değeri sizeof(Derived) olacaktır. Bu argüman olmadan, Derived türünde bir nesne için doğru miktarda bellek ayıramazız.

İlgili konular