2009-09-11 8 views
1

String data文字列データメンバーの意義は何ですか?

私はおよそ特に混乱していますと、この文は、「その内容が唯一の文字列オブジェクトの非定数メンバ関数への次の呼び出しまで変わらないことが保証されている。」

です

これは何を意味するのでしょうか?いつこれを使用するのを避けるために使用するのですか?

答えて

1

文字の配列としてフォーマットされた文字列にアクセスする必要があることがあります。通常、文字列をこのような文字列(たとえば、strcmp)に渡す必要があるためです。これ 内部の場所に

返された配列ポイントを

:あなたは dataまたは c_strメンバーを使用してこれを行うことができますが、あなたが提供されたリンクではっきり綴られ関数を呼び出すためのルールを尊重しなければなりませんプログラムで直接変更された であってはなりません。その の内容は、 文字列オブジェクトの非定数メンバ関数 への次の呼び出しまで、 のままであることが保証されます。

文字列のオブジェクトを変更することはできません。文字列オブジェクトはそうでないとみなします。これを行うと、未定義の動作につながります。

5

これは、ポインタを保存して後で使用できることを意味します。 2つのアクセスの間に非constメソッドが呼び出された場合、ストアド・ポインタが設定されているバッファの内容が変更され、予期しない動作に直面します。

4
const char* data() const; 

これは、誰かがそれがどこから来たという文字列を変更しない限り、str.data()を呼び出すことによって返さconst char *が変更されないことを言っています。誰かが非定数メンバ関数を呼び出すと、返されたポインタは無効であるか、str.data()関数が返された直後に指していたものとは異なるデータを指すことがあります。

つまり、返されたデータをC関数に渡すことができます。それはあなたが何かやるべきではありません意味: I/O メモリコピーが行われた時点で

const char *old = str.data(); 
size_t  len = str.length(); 
...call a function that modifies str... 
// cout << old << endl; 
// Since old is not guaranteed to be null terminated (thanks MSalter), 
// do something else with the old data instead of writing to cout. 
// Inventiveness not at a high this morning; this isn't a particularly 
// good example of what to do - a sort of string copy. 
char buffer[256]; 
memcpy(buffer, old, MIN(sizeof(buffer)-1, len)); 
buffer[len] = '\0'; 

を、oldはもはや有効ではない可能性があり、かつlenも正しくない可能性があります。

+1

追加: 通常、文字列を操作すると、文字列内に折り返されたc-stringの変更が発生します。 appendのような操作はc-stringの再割り当てを必要とするため、以前のメモリ位置は解放され、使用されなくなります。 – Basilevs

+0

Cの文字列をラップしないstd :: stringの実装が多数あるため(通常は一重の例外はラップされたchar []内に\ 0がありません) – MSalters

+0

ああ、例は間違っています。BTW:coutはnullで終了する文字列を必要とし、data()は一般的ではありません。 – MSalters

関連する問題