2016-02-10 11 views
5

नियुक्ति नई वाक्य रचना का उपयोग का उपयोग कर रखा गया है, मैं इस तरह कुछ करने के लिए सक्षम होना चाहिए:,कैसे निर्धारित करें कि वस्तु नियुक्ति नई

char *buffer = new char[sizeof(MyClass)]; //pre-allocated buffer 
MyClass *my_class = new (buffer) MyClass; //put da class there 

अब मान लीजिए कि मैं सिर्फ पहली पंक्ति करना, लेकिन दूसरी नहीं । क्या कोई तरीका है कि इसे कोड में निर्धारित किया जा सकता है कि बफर को उचित रूप से आवंटित किया गया है, लेकिन माइक्लास के प्रकार का कोई ऑब्जेक्ट अभी तक तत्काल नहीं हुआ है?

+2

आपको इसकी आवश्यकता क्यों है? यह सही प्रतीत नहीं होता है। – ZDF

+0

@ZDF जैसा कि यह पता चला है, क्योंकि मैंने समस्या को और अधिक बारीकी से देखा है, यह पता चला है कि मैं संभवतः नहीं करता हूं। तो आपके प्रश्न का उत्तर काफी स्पष्ट लगता है - अनुभवहीनता ... :) – Bitrex

उत्तर

1

मूल कोड:

char *buffer = new char[sizeof(MyClass)]; //pre-allocated buffer 
MyClass *my_class = new (buffer) MyClass; //put da class there 

निर्धारित करने के लिए गतिशील नियुक्ति new जानकारी निष्पादित किया गया है कि क्या बारे में यह कहीं संग्रहीत किया गया है। भाषा उस सेवा प्रदान नहीं करती है। इसलिए आपको इसे दो संभावित मुख्य तरीकों में से एक में करना है:

  • बफर में जानकारी संग्रहीत करना।
    इस मामले के लिए बफर को आवंटन में प्रारंभ करना होगा। जैसे अपने new अभिव्यक्ति के अंत में बस () जोड़ें। अन्यथा यह गारंटी देने का कोई तरीका नहीं है कि बफर सामग्री किसी ऑब्जेक्ट की तरह नहीं दिखती है। दो उप-मामले:
    1. बफर में ध्वज के लिए कमरा जोड़कर।
    2. ऑब्जेक्ट के सदस्य के रूप में ध्वज प्राप्त करके।
      पॉलिमॉर्फिक कक्षा के मामले में अभ्यास में एक गैर-शून्य vtable सूचक होगा, जो ध्वज के रूप में कार्य कर सकता है।
  • बाहरी जानकारी को संग्रहीत करना।
    इस मामले के लिए बफर को आवंटन में प्रारंभ करने की आवश्यकता नहीं है।
    1. एक साधारण bool चर सहित एक ज़िलियन प्लस कुछ संभावनाएं हैं।
    2. ऐसी सभी वस्तुओं के लिए पॉइंटर्स का संग्रह।
    3. एक चिम्पांजी को उत्सर्जित एक श्रव्य संकेत, जिसे बाद में पूछताछ की जाती है।
4

भाषा उस जानकारी को प्रदान करने के लिए कोई भी अंतर्निहित तंत्र प्रदान नहीं करती है, कम से कम कोई भी जिसे मैं जानता हूं। ऐसी जानकारी को ट्रैक करने के लिए आपको अपना स्वयं का बहीखाता कोड जोड़ना होगा।

1

आप this सूचकांक तालिका को बनाए रख सकते हैं जो आप रचनाकारों और विनाशक में MyClass पर उत्परिवर्तित करते हैं। फिर जब आपको आवश्यकता हो तो buffer के किसी विशेष मान के विरुद्ध इसे जांचें।

चाल semantics के repercussions पर विचार करना न भूलें। सही पाने के लिए मुश्किल हो जाएगा।

char *buffer = new char[sizeof(MyClass)]; //pre-allocated buffer 
MyClass *my_class = new (buffer) MyClass; //put da class there 
if (my_class->isValidSignature()) 
    <this means that the object has been allocated correctly, with a high probability> 
} 

आप सब कुछ है कि रख सकते हैं:

2

डीबगिंग उद्देश्यों के लिए, आप के रूप में निम्नानुसार signatureMyClass के लिए एक विशेष सदस्य जोड़ सकते हैं और तब एक निरंतर

class MyClass { 
    public: 
     MyClass() : signature(762347562374) {} 
     bool isValidSignature() const { return signature==762347562374; } 
    private: 
     unsigned long long signature; 
     <other members> 
}; 

लिए अपने मूल्य निर्धारित कर सकते हैं, जाँच यह एक उचित #ifdef के अंदर हस्ताक्षर से संबंधित, ताकि केवल डीबग मोड में ही चलाया जा सके।

+0

जब कोई झंडा गारंटीकृत व्यवहार उत्पन्न करता है तो सांख्यिकीय दृष्टिकोण का उपयोग क्यों करना चाहिए? –

+0

@ चीयर्संधथ.-अल्फ ऐसा लगता है कि उस समस्या का कुछ मामूली समाधान है जिसके बारे में आप बात कर रहे हैं। मुझे यह नहीं मिला; शायद आपको "ध्वज" से क्या मतलब है, यह समझाने के लिए एक उत्तर जोड़ना चाहिए। – anatolyg

+0

मुझे कक्षाओं से नफरत है जिनके पास डिबग में एक अलग (बड़ा) आकार है –

1

इसे स्वयं ट्रैक किए बिना नहीं।

एक समाधान std::allocator के आसपास एक रैपर बनाने के लिए होगा।

template<class T> 
class MyAllocator 
{ 
public: 
    T* allocate(std::size_t count = 1) 
    { 
     return allocator_.allocate(count); 
    } 

    template<class... Args> 
    void construct(T* ptr, Args&&... args) 
    { 
     allocator_.construct(ptr, std::forward<Args>(args)...); 
     allocated_ = true; 
    } 

    bool IsAllocated() const 
    { 
     return allocated_; 
    } 

private: 
    std::allocator<T> allocator_; 
    bool allocated_; 

}; 
+0

यह कैसे केवल 'बूल' चर से तुलना करता है? –

+0

बस सोचा कि चीजों को लपेटने का यह एक अच्छा तरीका था। –

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