내 질문은 삶의 문자열 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 (???)
문자열을 올바르게 인쇄합니까?
Visual Studio 2008에서 컴파일 중입니다.
str()
RVO가 시작될 수있는 방식으로 구현되는 경우 (아마 가능성이 높음) 컴파일러는 결과를 직접 생성 할 수 있습니다 에tmp
일시적으로 빠짐; 최신 C ++ 컴파일러는 최적화가 활성화되면 그렇게합니다. 물론 Const-to-Const-Reference 솔루션은 복사를 보장하지 않으므로 바람직 할 수 있습니다.