2017-05-13 21 views
7

मैं श्रेणियां होती हैं, उनमें से प्रत्येक के लिए इसका नामक्या यह std :: map key के रूप में const char * literal का उपयोग करना सुरक्षित है?

struct IFoo { 
    virtual const char * GetName() const = 0; 
} 

struct Foo : IFoo { 
    const char * GetName() const { return "Foo"; } 
} 

struct Bar: IFoo { 
    const char * GetName() const { return "Bar"; } 
} 

और कहीं और वापसी:

Foo* a = new Foo(); 
Foo* b = new Foo(); 

std::map<const char *, int> data; 
data[a->GetName()] = 0; 
printf("%i", data[b->GetName()]); 

स्ट्रिंग शाब्दिक स्मृति में एक ही स्थान पर संग्रहित किया जाना चाहिए, लेकिन यह 100% है? यह कोड जीसीसी में काम करता है, लेकिन मुझे इसकी बहु-प्लेटफार्म सुनिश्चित नहीं है।

+2

हां यह सुरक्षित है, वास्तव में प्रावधान विशेष रूप से सी ++ मानक में जोड़ा गया था ताकि यह –

+1

काम करता है, जब तक आप 'ऑपरेटर [] 'के रूप में' getName()' के परिणामों के साथ कॉल करते हैं, यह सुरक्षित है। यदि आप इसे किसी अन्य अनुवाद इकाई से हार्ड-कोडित '" Foo "के साथ कॉल करने का प्रयास करते हैं, तो परिणाम की गारंटी नहीं है। 'Gcc' पर यह काम करेगा, क्योंकि यह डिफ़ॉल्ट रूप से निरंतर पूल विलय करता है। – dasblinkenlight

+1

बहुत संबंधित, लगभग एक डुप्लिकेट: [अनुवाद इकाइयों में स्ट्रिंग लिटल एड्रेस] (http://stackoverflow.com/q/26279628/335858) – dasblinkenlight

उत्तर

5

यह एक std::map कुंजी के रूप में const char * शाब्दिक उपयोग करने के लिए सुरक्षित है?

हां।

हालांकि, विचार है कि यह आपके वस्तु को खोजने के लिए गारंटी नहीं है (लेकिन हो सकता है, क्रियान्वयन के आधार पर):

data["Foo"] 

और यह करने के लिए गारंटी है आपके वस्तु नहीं मिल रहा:

char[] str = "Foo"; 
data[str]; 

std::strcmp पर आधारित एक कस्टम मानचित्र तुलनित्र का उपयोग करने से उपर्युक्त दोनों मामलों को काम करने की अनुमति मिल जाएगी।

फिर एकमात्र जाल एक स्थानीय बफर को स्थानीय बफर से बाहर निकलने के लिए एक सूचक को संग्रहीत करने की संभावना है। ऐसा नहीं होने वाला है यदि आप केवल पाठ्यक्रम के स्ट्रिंग अक्षर संग्रहित करते हैं, लेकिन यह ऐसा कुछ है जिसे आपको मानचित्र के साथ काम करते समय ध्यान में रखना याद रखना चाहिए। std::string कुंजी में ऐसी चेतावनी नहीं होगी।

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