この関数は、c-stringのコピーを作成するために使用されます。これは文字列リテラルの書き込み可能なバージョンを取得するためにしばしば必要となります。それら(文字列リテラル)自体は書き込み可能ではないので、そのような関数はそれらを割り当てられた書き込み可能バッファにコピーします。引数を変更する関数に渡すことができます。例えば、strtok
のようにトークン化しなければならない文字列に書き込みます。
私はそれが
新しい
のstrdupと呼ばれているので、あなたがこのような何かを思い付くことができると思い
:
char * newstrdup(char const* str) {
char *c = new char[std::strlen(str) + 1];
std::strcpy(c, str);
return c;
}
あなたは
delete[] *string;
を使用して文字列を使用して、一度行って、それを解放することになってされるだろう
これを書き換える別の方法は、malloc
です。ライブラリが古い場合、それはC++はCから継承した、ことを使用している場合があります。
char * newstrdup(char const* str) {
char *c = (char*) malloc(std::strlen(str) + 1);
if(c != NULL) {
std::strcpy(c, str);
}
return c;
}
今、あなたが行われたときにfree
を使用して文字列を解放することになっている:
free(*string);
は、最初のバージョンを好みますあなたがC++で書いているなら。ただし、既存のコードでfree
を使用してメモリを再度割り当て解除する場合は、2番目のバージョンを使用してください。 2番目のバージョンは文字列をdupするためのメモリがない場合はNULL
を返すことに注意してください。その場合、最初の例外は例外をスローします。 にNULL
引数を渡すと、動作に関する別の注意が必要です。あなたのライブラリーに応じて、許可されているか許可されていない可能性があります。必要に応じて上記の機能に適切なチェックを挿入します。 POSIXシステムで利用可能なstrdup
という関数がありますが、NULL
引数を使用することも、C++
演算子newを使用してメモリを割り当てることもできません。
とにかく、私はnewstrdup
関数のGoogle codesearchを見てきましたが、かなりの数が見つかりました。たぶん、あなたのライブラリーは、結果のうちです:
Google CodeSearch, newstrdup
newstrdup()関数を貼り付けることはできますか? –
@ tinkertim: "ライブラリ関数を使用していて、ライブラリを持っていない古いプログラムがあります" ... –
newstrdupが使用されている古いコードを貼り付けることはできますか?ループ内で行うのが好ましい。 .hファイルからnewstrdupの宣言がありますか? – jmucchiello