आप एक वर्ग है जो एक वैश्विक (जैसे एप्लिकेशन के क्रम के लिए उपलब्ध)कैसे ठीक से वापस जाने के लिए std :: स्ट्रिंग (या कैसे ठीक है कि दिए गए मान का उपयोग करने)
class MyClass {
protected:
std::string m_Value;
public:
MyClass() : m_Value("hello") {}
std::string value() { return m_Value; }
};
MyClass v1;
पहले का उपयोग करना है कहो प्रपत्र मुझे अजीब व्यवहार देता है जब मैं
printf("value: %s\n", v1.value().c_str());
कर ऐसा लगता है कि स्ट्रिंग के रूप में यद्यपि स्मृति से गायब हो जाता है printf से पहले इसका इस्तेमाल कर सकते हैं। कभी-कभी यह मूल्य प्रिंट करता है: हैलो अन्य बार यह क्रैश या प्रिंट नहीं करता है।
मैं पहली बार इतना
std::string copiedString = v1.value();
printf("value: %s\n", copiedString.c_str());
चीजें काम करने की तरह स्ट्रिंग कॉपी करते हैं।
निश्चित रूप से अस्थायी स्ट्रिंग के साथ ऐसा करने से बचने का एक तरीका होना चाहिए।
संपादित करें: तो सर्वसम्मति एक कॉन्स std :: स्ट्रिंग & वापसी मूल्य के साथ जाना है।
मुझे पता है कि हर कोई कहता है कि मूल कोड ठीक होना चाहिए लेकिन मैं आपको बता सकता हूं कि मैंने विंडोज सीई पर एमएसवीसी 2005 को इसके साथ परेशानी है, लेकिन केवल सीई बॉक्स पर देखा है। Win32 क्रॉस संकलन नहीं है।
क्या आप एक संकलित उदाहरण पोस्ट कर सकते हैं? ठीक है, मैं नहीं देखता कि आप क्या अनुभव कर रहे हैं। – Falmarri
अस्थायी 'v1.value()' पूर्ण अभिव्यक्ति के अंत तक जीना चाहिए, यानी इसे 'printf' रिटर्न से पहले नष्ट नहीं किया जाना चाहिए। –
@ चार्ल्स बेली: क्या यह वास्तव में होना चाहिए? क्या यह नियमित रूप से c_str() से नियमित char * प्राप्त करने के लिए मूल्यांकन नहीं किया गया है? – villintehaspam