2016-11-16 6 views
-2

以下の例では、定数のC文字列を指す定数ポインタとしてfnを使用しています。無関係の他のconstポインタを宣言して別の定数のc-stringに代入すると、元のfnが変更されます。なぜ私はしばらく理由を把握しようとしていますが、これを引き起こす可能性のあるものは見えませんか?無関係な文字列を割り当てると、別の文字列が変更されるのはなぜですか?

出力:

オリジナルFN:sampleStrWithExtension

修正FN:randomStr2ModifiedFn

int main() { 
     std::string baseString = "sampleStr"; 
     std::string randomBaseString = "randomStr2"; 
     const char* const fn = (baseString + "WithExtension").c_str(); 
     std::cout << "Original fn: " << fn << std::endl; 
     const char* const variableNotFn = (randomBaseString + "ModifiedFn").c_str(); 
     std::cout << "Modified fn: " << fn << std::endl; 
     return 0; 
    } 
+1

'fn =(baseString +" WithExtension ").c_str()'は非常に厳密な割り当てではありません。式 'baseString +" WithExtension "によって作成された' string'オブジェクトは、この割り当てが完了した直後に破棄され、変数 'fn'は割り当てられていないメモリを指しています。 –

+4

'x.c_str()'の存続期間は決して 'x'の存続期間を超えて延びません。 – Angew

答えて

8
const char* const fn = (baseString + "WithExtension").c_str(); 

これは、未定義の動作になります。

baseString + "WithExtension" 

これにより、一時的なstd::stringオブジェクトが作成されます。 std::string+演算子は、新しいstd::stringを返します。この式のコンテキストでは、返されたstd::stringは一時オブジェクトになります。 c_str()は、この一時オブジェクトの内部バッファへのポインタを返します。

c_str()によって返されたポインタは、std::stringが変更されるか、または破棄されるまで有効です。上の式の最後に、一時オブジェクトが破棄されます。

このポインタを後で使用すると、未定義の動作が発生します。

+2

厳密に言えば、未定義の動作ではありません。これは、それ以上の既存の文字列へのポインタに過ぎません。未定義の動作は、逆参照すると発生します – valdo

関連する問題