6

宿題のstd::stringに似た文字列クラスを書いていますが、メモリリークを引き起こさず、メモリリークが発生しないまで同じままであることが保証されているc文字列を返す方法がわかりません。長く使用されています。私は現在持っています:

const char* string::c_str()
{
    char c[_size+1];
    strncpy(c,_data,_size);
    c[_size]='\0';
    return c;
}

ただし、呼び出された直後に内容が上書きされます。動的割り当てを行うと、メモリリークが発生するか、特定の文字列から常に1つのc文字列しか存在できなくなります。どうすればこれを回避できますか?

4

3 に答える 3

7

ただし、が指す文字列は、が次に変更(または破棄)c_strされるまで、明確に定義されているだけです。std::string

これを実現する1つの方法は、内部バッファへのポインタを返すことです(nullで終了していると仮定します)。標準に準拠しc_strている場合は、O(1)時間で動作する必要があることに注意してください。したがって、コピーは許可されていません。

于 2012-07-04T23:33:03.830 に答える
4

http://www.cplusplus.com/reference/string/string/c_str/から:

返される配列は、この文字シーケンスに必要なストレージスペースとその終了ヌル文字を含む内部位置を指しますが、この配列の値はプログラムで変更しないでください。次の呼び出しまで変更されないことが保証されます。文字列オブジェクトの非定数メンバー関数。

于 2012-07-04T23:33:43.950 に答える
0

c_str()によって返されるバッファーは、使用されなくなるまで同じであるか、有効であることが保証されていません。

std :: stringが何らかの方法で変更されるまで、有効であることが保証されます。

実装は簡単です。文字列の内部表現を常にnullで終了させ、c_str()から内部表現へのポインタを返すだけです。

于 2012-07-04T23:37:10.063 に答える