2014-12-29 10 views
0

나는 C++을 사용하여 매우 새로운 것으로 시작해야한다고 생각합니다. 더 높은 수준의 언어에서 왔기 때문에 식별 할 수없는 기술적 인 문제가 누락되었을 수 있습니다.스트림을 사용하는 문자열 연결은 정크를 반환합니다.

const char * Point::toString() const { 
    std::ostringstream stream; 
    stream << "[" << x << ", " << y << "]"; //[3, 5] for example 
    return stream.str().c_str(); 
} 

그때 이런 식으로 전화 해요 : :

Point p1 (3, 5); 
std::cout << p1.toString() << std::endl; 

그러나이 일부 정크를 인쇄

나는 다음과 같은 방법이있다.

내가 뭘 잘못하고 있니? 또한, 내 toString() 방법은 정말 효율적입니까? char *을 새로 할당하여 메모리가 누출 되었습니까?

+1

'std :: string Point :: toString() const {'을 사용하면 더 잘 작동 할 것입니다. 함수 범위가 남아있는 즉시 포인터는 무효화됩니다. –

+0

@ πάνταῥεῖ 와우, 그게 문제를 해결했습니다! 지금 무슨 일이 일어 났는지 이해하고 있다고 생각합니다. –

답변

2

string::c_str()이 반환 한 char 포인터는 문자열의 유효 기간 동안 만 유효합니다 (수정되지 않은 경우에만 해당).

하지만 stream.str()은 임시 개체 을 반환하며 어딘가에 저장해야합니다. 그렇지 않으면 이 파괴되고이 그 함수를 호출 한 정확한 문장을 말합니다.

하지만

string result = stream.str(); 
return result.c_str(); 

은 다음 숯불 포인터 c_str()에 의해 반환하고 즉시이 사용되는 정의되지 않은 동작의 결과 무효화, 함수의 내부 문자열 객체를 파괴 쓰는 경우에도 (역 참조) . 최고의 결국

, 그냥 문자열을 반환하는 것입니다 : 당신은 그냥 strdup (stream.str().c_str())을 반환 할 수

return stream.str(); 
0

,하지만 당신은 자신에 의해이 메모리를 관리해야합니다.