10/04/24 16:38:53
>>391
> strdup()のデメリットがfree()を必要とすることでは無い
> オブジェクトを生成したら破棄するのは当然のことである(create/destroyの対が大切)
確かに当然のことです。当然のことですので、その当然のことを忘れた場合、深刻なバグになるという大きなデメリットがあります。
> my_strdup()のメリットが自動変数を引数に渡せるとかなんとか言っているが
> 自動変数の領域が足りない場合や書き換えが必要な場合、結局メモリ確保が必要となり自動変数が渡せることはデメリットでしかない
自動変数で問題がいない場面では、上記の深刻なバグを避けられるという点で十分メリットがあります。
仰りたいことはわかりますが、一概に決められるものではないと思います。
例えば、>>391の主張では、memcpyはデメリットしか無いことになってしまいますよね?
> 呼出元が生成と破棄を対にして行うのが良い
良いのはわかります。つまり、それがstrdupや、>>351の(1)の場合ですよね。
my_strdupにmallocで確保したメモリー領域を与え、使用後freeするのも良いと思います。
ですが、my_strdupに自動変数を渡してはいけないということにはならないですよね?下記のようなコードは普通に書かれると思います。
void func(const char* str) //strは99文字以下の文字列
{
char buf[100];
strncpy(buf, str, sizeof(buf));
/*strに対する処理*/
printf("%s\n", str);
}
これは、若干恣意的な例ですが、これに限らず、自動変数の構造体や配列へのポインターを関数に渡すことは一般的に行われることですよね。