文字の配列は静的な保存期間があるため、プログラムの実行全体でぶらぶらします。これは、それらを削除する必要があるという意味ではありません。プログラムの全期間中、それらは残ります。実際、それを呼び出すと、delete
未定義の動作が発生します。delete
で割り当てられたものだけができますnew
。
ポインタ自体には自動保存期間があり、スコープ外になると破棄されます。const char*
文字列リテラルはの配列を提供するため、ポインタはである必要があることに注意してくださいconst char
。検討:
void func()
{
const char* str = "Hello";
}
を含む文字の配列はHello\0
、プログラムの期間中存在します。ポインタstr
は、その関数の期間中のみ存在します。ここにある必要はありませんdeleted
。
あなたがそれについて考えるならば、これは非常に理にかなっています。ソースコードに書き込むこれらの文字列はすべて、実行可能ファイルのどこかに存在する必要があります。コンパイラは通常、これらの文字列を実行可能ファイルのデータセグメントに書き込みます。プログラムを実行すると、実行可能ファイルが文字列を含むデータセグメントとともにメモリにロードされます。
プログラムに同じまたは重複するテキストを持つ2つの文字列リテラルがある場合、コンパイラがそれらの1つだけを格納するように最適化できない理由はありません。検討:
void func()
{
const char* str1 = "Hello";
const char* str2 = "Hello";
const char* str3 = "lo";
}
コンパイラは、Hello\0
ここで1回だけ実行可能ファイルに文字を書き込む必要があります。最初の2つのポインターはを指しH
、3番目のポインターは2番目を指しl
ます。コンパイラはこのような最適化を行うことができます。もちろん、この例では、コンパイラーは文字列をすべてまとめて削除するだけでさらに最適化できます。これらの文字列は、プログラムの観察可能な動作に寄与するような方法では使用されません。
そうです、プログラムの観察可能な動作に何らかの形で寄与する100万の異なる文字列リテラルがある場合、もちろん、それらは実行可能ファイルの一部として存在する必要があります。