char *の古い使用は非推奨になっているので、単に文字列を使用することはできませんか?
const char* func1 () {return "string literal";}
string func2 () {return "another string literal";}
これらは両方とも正常に機能し、コンパイラの警告はありません。
でも
char* func3 () {return "yet another string literal";}
まったくコンパイルされません。また、
char* func4 () {return &"a ref to a string literal?";}
Stroustrupは、「C ++プログラミング言語」(第3版)で次のように述べています。
「文字列リテラルは静的に割り当てられるため、関数から安全に返すことができます。
const char* error_message (int i)`
{
//...
return "range error";
}
error_messages()を呼び出しても、メモリ保持範囲エラーは解消されません。」
したがって、プログラム内のすべての文字列リテラルは、プログラムの期間中持続する独自の小さなメモリに割り当てられます(つまり、静的に割り当てられます)。constをchar*の前に置くと、コンパイラは、文字列リテラルの小さなメモリを変更するつもりはない(そして変更できない)ことを知らせます。そのため、文字列リテラルからchar *に変換しても、この割り当てはスライドします。非推奨です。
代わりに文字列に戻るには、文字列リテラルを文字列型のオブジェクト(呼び出し元が担当するメモリ)にコピーする必要があります。
どちらの方法でも、メモリリークは発生しません。すべての文字列リテラルは、プログラムの終了時にクリーンアップされる独自のメモリを取得します。return to const char *は、リテラルのメモリへのポインタを返します(変更できないことを知っています)。文字列に戻ると、呼び出し元のコードに存在する文字列オブジェクトにコピーが作成され、呼び出し元によってクリーンアップされます。
表記的には少し醜いように見えますが、安価な代替手段(コピーを含まない)を維持するために、constchar*を残したと思います。