2010-02-24 9 views
8

मैं जानना चाहता हूं कि section 11.14 of the C++-FAQ-lite को सरणी में कैसे अनुकूलित करें।आप ओवरलोडेड पूल ऑपरेटर को कैसे घोषित करते हैं और उपयोग करते हैं?

class Pool { 
public: 
    void* allocate(size_t size) {...} 
    void deallocate(void* p, size_t size) {...} 
}; 

void* operator new[](size_t size, Pool& pool) { return pool.allocate(size); } 
void operator delete[](void* p, size_t size, Pool& pool) { pool.deallocate(p, size); } 

struct Foo {...}; 

int main() { 
    Pool pool; 

    Foo* manyFoos = new (pool) Foo [15]; 

    /* ... */ 

    delete [] (pool) manyFoos; 
} 

हालांकि, मैं घोषणा और इस operator delete[] (pool) कॉल करने के लिए सही सिंटैक्स यह पता लगाने की नहीं कर पाए हैं:

असल में, मैं कुछ इस तरह चाहते हैं। क्या कोई यहां मदद कर सकता है?

उत्तर

1

यह असंभव है। बजेर्न के कारणों से आप सही पूल को सही तरीके से समझने में कभी भी सही नहीं पाएंगे। उनका समाधान है: आपको मैन्युअल रूप से सभी विनाशकों को कॉल करना होगा और फिर सही पूल को मैन्युअल रूप से स्मृति को हटाने में सक्षम होना चाहिए।

संदर्भ:

Bjarne के पूछे जाने वाले प्रश्न: Is there a placement delete?

प्रासंगिक सी ++ मानक अनुभागों:

3.7.3.2.2 केवल सदस्य ऑपरेटर size_t प्रकार का एक तर्क के साथ कार्यों के लिए हटाएं भाव के लिए माना जाता है।

5.3.5.1 अभिव्यक्ति वाक्यविन्यास हटाएं अतिरिक्त पैरामीटर की अनुमति नहीं देता है।

2

कॉल पहले और उसके बाद अलग-अलग वस्तुओं पर dtors का उपयोग करें:

for (int i = 0; i < 15; ++i) manyFoos[ i ]->~Foo(); 
operator delete[] (manyFoos, pool); 

आप फिर से पूरे पूछे जाने वाले प्रश्न आइटम पढ़ सकते हैं और आप इसे वहाँ मिल जाएगा।

+0

क्षमा करें, मुझे यह नहीं मिला। यह कथन 'एकाधिक फ़ूज़' सरणी को कैसे हटाता है? और संकलक कैसे 'ऑपरेटर हटाएं []' को कॉल करने के लिए जानता है, 'ऑपरेटर हटाएं' नहीं? – Tobias

+0

@ टोबियास: मेरे पास एक टाइपो था। फिक्स्ड पोस्ट – dirkgently

+0

@Tobias: प्लेसमेंट फॉर्म का उपयोग करते समय आपको यह करने की ज़रूरत होती है कि संकलक अन्यथा स्वचालित रूप से आपके लिए क्या करता है - 1) ऑब्जेक्ट पर dtor को कॉल करें 2) स्मृति को मुक्त करें। कोड की पहली पंक्ति # 1 का ख्याल रखती है। अब, दूसरी पंक्ति, 'पूल' के उस हिस्से को मुक्त करने का ख्याल रखती है जहां आपकी सरणी वस्तुएं आईं। – dirkgently

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