मैं श्रेणियां होती हैं, उनमें से प्रत्येक के लिए इसका नामक्या यह 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% है? यह कोड जीसीसी में काम करता है, लेकिन मुझे इसकी बहु-प्लेटफार्म सुनिश्चित नहीं है।
हां यह सुरक्षित है, वास्तव में प्रावधान विशेष रूप से सी ++ मानक में जोड़ा गया था ताकि यह –
काम करता है, जब तक आप 'ऑपरेटर [] 'के रूप में' getName()' के परिणामों के साथ कॉल करते हैं, यह सुरक्षित है। यदि आप इसे किसी अन्य अनुवाद इकाई से हार्ड-कोडित '" Foo "के साथ कॉल करने का प्रयास करते हैं, तो परिणाम की गारंटी नहीं है। 'Gcc' पर यह काम करेगा, क्योंकि यह डिफ़ॉल्ट रूप से निरंतर पूल विलय करता है। – dasblinkenlight
बहुत संबंधित, लगभग एक डुप्लिकेट: [अनुवाद इकाइयों में स्ट्रिंग लिटल एड्रेस] (http://stackoverflow.com/q/26279628/335858) – dasblinkenlight