मेरे सवाल को उबाला जा सकता है, स्ट्रिंग stringstream.str().c_str()
स्मृति में लाइव कहां से लौटती है, और इसे क्यों नहीं सौंपा जा सकता है const char*
?
यह कोड उदाहरण मुझे इससे बेहतर समझाएगा
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
stringstream ss("this is a string\n");
string str(ss.str());
const char* cstr1 = str.c_str();
const char* cstr2 = ss.str().c_str();
cout << cstr1 // Prints correctly
<< cstr2; // ERROR, prints out garbage
system("PAUSE");
return 0;
}
अनुमान है कि एक बग के लिए stringstream.str().c_str()
सौंपा जा सकता है const char*
जो मुझे नीचे ट्रैक करने के लिए कुछ समय लगा।
बोनस बिंदुओं के लिए, क्या कोई समझा सकता है कि cout
कथन को प्रतिस्थापित क्यों किया जाए
cout << cstr // Prints correctly
<< ss.str().c_str() // Prints correctly
<< cstr2; // Prints correctly (???)
तार को सही ढंग से प्रिंट करता है?
मैं विजुअल स्टूडियो 2008 में संकलन कर रहा हूं।
str()
इस तरह से लागू किया जाता है कि आरवीओ (जो बहुत संभावना है) में किक कर सकता है, संकलक को सीधे परिणाम के निर्माण की अनुमति है मेंtmp
, अस्थायी eliding; और कोई भी आधुनिक C ++ कंपाइलर ऐसा करेगा जब अनुकूलन सक्षम हो। बेशक, बाइंड-टू-कॉन्स्ट-रेफरेंस सॉल्यूशन नो-कॉपी की गारंटी देता है, इसलिए यह बेहतर हो सकता है - लेकिन मुझे लगा कि यह अभी भी स्पष्ट करना है।