2012-05-27 16 views
20

मैं एक छोटे से परियोजना पर काम कर और एक स्थिति है जहाँ निम्नलिखित हुआ आ गया था:एक std :: स्ट्रिंग में एक nullptr असाइन करें सुरक्षित है?

std::string myString; 
#GetValue() returns a char* 
myString = myObject.GetValue(); 

मेरा प्रश्न है, तो GetValue() रिटर्न नल myString कोई रिक्त स्ट्रिंग हो जाता है? क्या यह अनिर्धारित है? या यह segfault होगा?

+1

यह प्रश्न बहुत समान है: http://stackoverflow.com/questions/2407711/avoiding-improper-stdstring-initialization-with-null-const-char-using-g – chris

+2

माइक्रोसॉफ्ट के पास हमेशा एक बग था जहां 0x0 असाइन किया गया था std :: स्ट्रिंग ठीक था। अपने कोड को देखकर ऐसा लगता है कि आप एक माइक्रोसॉफ्ट लड़के हैं, इसलिए यह आपके लिए काम कर सकता है। लेकिन .. अन्यथा यह एक SIGSEGV ट्रिगर करेगा। –

उत्तर

38

दिलचस्प मामला। सी ++ 11 मानक, संप्रदाय के अनुसार। 21.4.2.9,

basic_string(const charT* s, const Allocator& a = Allocator()); 

आवश्यक है: एक नल पॉइंटर नहीं होगा।

चूंकि यह मानक लाइब्रेरी से अपवाद फेंकने के लिए नहीं कहता है जब यह विशेष आवश्यकता पूरी नहीं होती है, तो ऐसा लगता है कि एक शून्य सूचक पास करने से अपरिभाषित व्यवहार को उकसाया जाता है।

9

यह रनटाइम त्रुटि है।

आप इस करना चाहिए:

myString = ValueOrEmpty(myObject.GetValue()); 

जहां ValueOrEmpty के रूप में परिभाषित किया गया है:

std::string ValueOrEmpty(const char* s) 
{ 
    return s == nullptr ? std::string() : s; 
} 

या आप const char* लौट सकता है (यह बेहतर समझ में आता है):

const char* ValueOrEmpty(const char* s) 
{ 
    return s == nullptr ? "" : s; 
} 

आप तो const char* पर वापस जाएं, फिर कॉल-साइट पर, यहमें परिवर्तित हो जाएगा।

4

मेरा प्रश्न यह है कि अगर GetValue() रिटर्न न्यूल MyString एक खाली स्ट्रिंग बन जाता है? क्या यह अनिर्धारित है? या यह segfault होगा?

यह अनिर्धारित व्यवहार है। कंपाइलर और रन टाइम जो कुछ भी चाहता है वह कर सकता है और अभी भी अनुपालन कर सकता है।

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