この関数は、c-string のコピーを作成するために使用されます。これは、文字列リテラルの書き込み可能なバージョンを取得するために必要になることがよくあります。それら (文字列リテラル) 自体は書き込み可能ではないため、このような関数はそれらを割り当てられた書き込み可能なバッファーにコピーします。strtok
次に、トークン化する必要がある文字列に書き込むなど、指定された引数を変更する関数にそれらを渡すことができます。
new 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 番目のバージョンを使用してください。NULL
2 番目のバージョンは、文字列の複製に使用できるメモリがない場合に戻りますが、その場合、最初のバージョンは例外をスローすることに注意してください。NULL
に引数を渡すときの動作について、もう 1 つ注意する必要がありますnewstrdup
。ライブラリによって、許可される場合と許可されない場合があります。したがって、必要に応じて上記の関数に適切なチェックを挿入してください。strdup
POSIX システムで availableと呼ばれる関数がありますが、その関数は引数を許可せず、演算子 new を使用してメモリを割り当てNULL
ません。C++
とにかく、私はグーグルのコードサーチでnewstrdup
関数を調べたところ、かなりの数が見つかりました。多分あなたのライブラリは結果の中にあります:
Google CodeSearch、newstrdup