次のコードのすべての長所/短所について明確にしたいと思います。
{
char *str1 = strdup("some string");
char *str2 = "some string";
free(str1);
}
str1:
- 文字列の内容を変更できます
str2:
- free()を使用する必要はありません
- もっと早く
他に違いはありますか?
可能であればどちらも使用せず、次のいずれかで回避してください
static char const str3[] = { "some string" };
char str4[] = { "some string" };
str3
変更する予定がない場合、および変更するstr4
場合。
str3
プログラム内の他の関数が文字列を変更できないようにします(文字列リテラルは共有され、変更可能である可能性があります)。str4
スタックに一定サイズの配列を割り当てるため、割り当てと割り当て解除にオーバーヘッドはありません。システムはデータをコピーするだけです。
元の文字列(ソース内のリテラル、メモリマップトファイルの一部、またはプログラムの別の部分が「所有」する割り当てられた文字列)を使用すると、メモリを節約でき、醜いエラー状態を排除できるという利点があります。それ以外の場合は、割り当てを実行した場合に処理する必要があります(失敗する可能性があります)。もちろん、欠点は、この文字列が現在使用しているコードによって「所有」されていないため、変更/解放できないという事実を追跡する必要があることです。これは、使用する文字列が構造体に割り当てられているかどうかを示すために、構造体にフラグが必要であることを意味する場合があります。小さなプログラムでは、いくつかの関数を介して文字列の所有権のロジックを手動で実行し、それが正しいことを確認する必要があることを意味する場合があります。
ちなみに、文字列が構造体によって使用される場合、構造体に割り当てられたかどうかを示すフラグを保持する必要があることを回避する1つの良い方法は、構造体と文字列(必要な場合)にスペースを割り当てることです。 )への1回の呼び出しでmalloc
。次に、文字列が構造体に割り当てられたか、文字列リテラルまたは他のソースから割り当てられたかに関係なく、構造体の解放は常に機能します。