2016-03-12 5 views
9
void changeString(const char* &s){ 
    std::string str(s); 
    str.replace(0, 5, "Howdy"); 
    s = str.c_str(); 
} 

int main() { 
    const char *s = "Hello, world!"; 
    changeString(s); 
    std::cout << s << "\n"; 
    return 0; 
} 

このコードを実行すると、「Howdy、world!」という文字が印刷されます。 changeStringが終了するとstrが破壊されると思います。私は道で何かを逃していますかstd::stringは割り当てられますか?C++での文字列割り当て:これはなぜ機能しますか?

+0

I * guess * this *起こった*働く。 – MikeCAT

+0

未定義の動作が動作するように見えることがあります。しかし、これがうまくいくとは思わないはずです。 –

+0

不運それが間違っているのは間違いありません。 –

答えて

13

はい、strが破棄されました。文字列のメモリはクリアされません。あなたの "s"ポインタは空きだがクリアされていないメモリを指しています。すごく危ない。

13

changeStringにおけるローカルstd::stringのデストラクタがポインタがまだを指すメモリを解放したのでstd::cout << sは、ポインタにアクセスしようとしたときには未定義の動作です。

コンパイラはエラーを診断する必要はありませんが、バイナリを生成することができます。

あなたが望む出力を得たという事実は、それがあなたになったために悪い幸運だったはあなたのコードが正しいと思います。たとえば、マシン上にコードをコンパイルして、代わりに空の出力を得ました。それはまた墜落しているかもしれないし、他の無関係な事をしたかもしれない。

関連する問題