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; 
    } 
} 

मेरा प्रश्न कोड में भी एम्बेड किया गया है।आकार ए :: ऑपरेटर नया() हमेशा आकार के बराबर (ए) के बराबर हैं?

क्या सी ++ मानक गारंटी देता है कि ए :: ऑपरेटर नया() में पारित आकार हमेशा समान होते हैं?

अद्यतन: यहां, केवल विचार करें कि ए केवल अंतिम श्रेणी है।

उत्तर

4

उद्धरण, खंड 5.3.4 बिंदु 10:

एक नई अभिव्यक्ति पहले तर्क के रूप में आवंटन समारोह करने का अनुरोध स्थान की मात्रा गुजरता टाइप std :: size_t। वह तर्क वस्तु के आकार से कम नहीं होगा; यह ऑब्जेक्ट के आकार से अधिक हो सकता है केवल ऑब्जेक्ट एक सरणी है।

तो, हाँ, यह ऑब्जेक्ट के आकार के समान होने की गारंटी है। ध्यान दें कि विभिन्न कंपाइलर या विभिन्न कंपाइलर विकल्प संकलन-समय पर किसी विशेष ऑब्जेक्ट के वास्तविक आकार को बदल सकते हैं।

4

सं

प्रयास करें:

struct B: public A 
{ 
    double a; 
} 

अब नए ऑपरेटर जब आप एक बी

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

पी एस बनाने के लिए एक अलग आकार मिल जाएगा यह देखने के लिए एक प्रिंट जोड़ें:

void* operator new(size_t size) 
{ 
    std::cout << "S(" << size << ")\n"; 
    // 
    // Is size always equal to sizeof(A) here? 
    // 
    return ::operator new(size); 
} 

हे utput: सी ++ 11 मानक से

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

ए के बारे में अंतिम श्रेणी क्या है? – xmllmx

+1

@xmllmx: सी ++ –

+0

में ऐसी कोई चीज़ कृपया पोस्ट की समीक्षा करें। मैंने इसे संशोधित किया। मैं संरचना एक अंतिम बनाते हैं। – xmllmx

संबंधित मुद्दे