c++ の文字列リテラルは静的メモリに作成され、プログラムの終了時にのみ破棄されますか?
4 に答える
はい、文字列リテラルは、静的オブジェクトの破棄中であっても、プログラムの全期間有効です。
標準の2.13.4/1は言う
通常の文字列リテラルには、「n const char の配列」型と静的な保存期間があります。
標準では、3.7.1/1 の「静的保存期間」について次のように述べています。
これらのオブジェクトのストレージは、プログラムの期間中持続するものとします。
それが作成される場所は、実際にはコンパイラの作成者による実装の決定です。ほとんどの場合、文字列リテラルは変更されないため、メモリの読み取り専用セグメントに格納されます。
古いコンパイラの時代には、これらのリテラルのような静的データと、グローバルだが変更可能なデータがありました。これらは、TEXT (コード) セグメントと DATA (初期化されたデータ) セグメントに格納されていました。
のようなコードがある場合でも、変数がスタック上にある間 (またはグローバルの場合は書き込み可能なメモリ内の他の場所) char *x = "hello";
、hello
文字列自体は読み取り専用メモリに格納されます。文字列のアドレスに設定されるだけです。これにより、文字列の折りたたみなどのあらゆる種類のトリッキーな処理が可能になり、次のように「無効なオプション」(0x1000) と「有効なオプション」(0x1002) が同じメモリ ブロックを使用できるようになります。x
x
hello
+-> plus:0 1 2 3 4 5 6 7 8 9 A B C D E
| +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+
0x1000 | i | n | v | a | l | i | d | | o | p | t | i | o | n | \0 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+
ROMの観点からは読み取り専用メモリを意味するのではなく、変更不可能なものを格納する専用のメモリを意味することに注意してください(OSによって実際に読み取り専用とマークされる場合があります)。
また、終了するまで破壊されることはありませんmain()
。
はい、そうです。それらは一種でなければなりません。各文字列の文字列を構成する情報は、どこかにある必要があります。それらが動的に割り当てられてから初期化される場合、初期化に使用される情報はどこにありますか? したがって、単純に文字列を静的にする方が効率的です。そうすれば、プログラムの読み込みが完了すると、文字列は常に使用可能になり、有効になります。
文字列リテラルはメモリの読み取り専用セグメントに格納されます