2011-06-29 9 views
3

NSStringがstd :: stringに属するconst char *を弱く含んでいる最も安全な方法は何ですか?以下の両方の例は、単純なテスト、ログ、およびNSTableViewに表示されているように動作しますが、私は道路までの奇妙な動作を懸念しています。 c_str()の余分なヌル文字である可能性があります(長さパラメータが渡されたため)単純に無視され、いずれか正常に動作します。NSStringが弱くstd :: stringのconst char *を保持する

は考える:次に

std::string const * stdstring = new std::string("Let's see if this works"); 

NSString * aStr = [[NSString alloc] initWithBytesNoCopy: 
    stdstring->data() length: stdstring->length() 
    encoding:NSUTF8StringEncoding freeWhenDone:NO]; 

か:

NSString * aStr2 = [[NSString alloc] initWithBytesNoCopy: 
    stdstring->c_str() length: stdstring->length() 
    encoding:NSUTF8StringEncoding freeWhenDone:NO]; 

または何か他のものを?

+1

これを読んでいる他の人には、文字列のコピーは大部分のケースで非常に安いです。あなたの解析する巨大な(100kB +)文字列を除き、これを危険にさらすことはありません。あなたがそれをしている場合は、最初にそれらを単一の文字列としてロードする必要性を確認してください。このような「スピードアップ」を見る前にプロフィールを作成してください。 – rvalue

答えて

2

initWithBytesNoCopy:length:...のドキュメントでは、使用されているバイト数がlengthであるため、null終了文字は常に無視されます。したがって、data()およびc_str()によって返されたメモリの内容も同様に適しています。念頭に置いて

std::stringdata()c_str()関数によって返されたメモリの

生涯保証は同じです - あなたは、文字列オブジェクトの非constメンバ関数を呼び出すまで、彼らは生き残るだろう。内部データ構造がすでにヌル文字で終わっているかどうかは実装によって異なりますので、一般的にはdata()c_str()に比べて安くなったり同一になります。私はdata()のために行くだろう。

+1

今後の標準では、c_str()とdata()は標準仕様と同義語になります – sehe

関連する問題