2013-04-02 3 views
1

아래 코드는 내 컴퓨터 (devcpp)와 codepad.org를 작성했지만 일치하는 항목은 잘 작동하고 codepad.org (http://codepad.org/XfW5a8en)는 가비지 문자입니다.const_cast를 사용하는 중에 예기치 않은 출력이 발생했습니다.

#include <iostream> 
    #include<cstring> 
    using namespace std; 
    int main() { 
     char *str1 =const_cast<char*>(string("Hello ").c_str()); 
     char *str2 = const_cast<char*>(string("World!").c_str()); 
     char *ptr = str1; 
     char *&rptr = str1; 
     rptr = str2; 
     std::cout << ptr << str1 << std::endl; 
    } 

나는 안녕하세요 세계로 출력을 기대하고 있습니다!

+3

'string ("Hello")'와'string ("World!")는 임시 객체이며';'다음에 자체 행에서 파기됩니다. –

+0

나는 최신 표준에 대한 최신 정보가 없지만'c_str()'에 의해 반환 된 포인터는 객체가 유효한 한 (C++ 0X 이전의) IMHO는 코드가 정의되지 않은 동작을 노출하는 데 사용되었다. 그것은 살았고,'string ("Hello")'는 std :: cout의 사이트에서 이미 파괴되었을 수있는 임시 파일을 생성합니다. – Axel

답변

7

어디에도 저장하지 않고 string("Hello ")이라고 말하면 문자열을 만드는 식 끝에 문자열을 삭제할 수 있습니다.

파괴 된 문자열에 의해 소유 된 메모리에 대한 포인터를 가져 오는 중입니다.이 문자열은 나중에 일정 기간 동안 "Hello "의 값을 유지할 수도 있고 유지하지 않을 수도 있지만 그럴지 또는 얼마나 오래 지속되는지는 정의되지 않습니다 .

"정의되지 않은 동작"은 "작동하는 것처럼 보임"을 의미하기 때문에 컴퓨터에서만 작동합니다. :-)

+1

Pedantically, 그것은 "즉시"파괴 될 수 없습니다. 그것은 그것을 창조하는 완전한 표현의 끝까지 지속되지만 더 이상 존재하지 않습니다. –

+0

@MikeSeymour : 좋은 지적; 수정 됨. – RichieHindle

관련 문제