2013-04-02 4 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; 
    } 

Я ожидаю выход как Hello World!

+3

'string (" Hello ")' и 'string (« World! »)' Являются временными объектами, уничтоженными после ';' в своих строках. –

+0

Я не в курсе последних стандартов, но IMHO в прежние времена (до C++ 0X), код, используемый для раскрытия неопределенного поведения, потому что указатель, возвращаемый 'c_str()', был действителен только до тех пор, пока объект он был получен из live, а 'string (" Hello ")' создает временное, которое уже может быть разрушено на сайте вашего 'std :: cout'. – Axel

ответ

7

Когда вы говорите string("Hello "), не сохраняя его нигде, строка может быть уничтожена в конце выражения, которое ее создает.

Вы берете указатель на память, принадлежащую этой разрушенной строке, которая может или не может содержать значение "Hello " в течение некоторого времени после этого, но не определено, произойдет ли это или как долго ,

Он работает только на вашей машине, потому что иногда «неопределенное поведение» означает «похоже, что он работает». :-)

+1

Педантично, он не может быть «мгновенно» уничтожен. Он длится до конца полного выражения, которое его создает, но больше не существует. –

+0

@MikeSeymour: хорошая точка; исправленный. – RichieHindle