10

""(つまり、空の文字列)を使用して std::string 変数を初期化する際に問題に直面しています。以前は機能していたコードで奇妙な動作が発生しています。次の記述は間違っていますか?

std::string operationalReason = "";

次のコードを使用すると、すべて正常に動作します。

std::string operationalReason;
operationalReason.clear();

文字列リテラルは、コンパイラに依存する別のメモリ位置に格納されていると思います。私が見ている問題は、実際にそのストレージの破損を示している可能性がありますか? もしそうなら、それはclear() 関数の私の使い方によって隠されます.

ありがとう。

4

4 に答える 4

30
std::string operationalReason; //is enough!

デフォルトのコンストラクターを呼び出し、とにかく空の文字列を作成します。

だから私std::string operationalReason = ""はやり過ぎだと言うでしょう。

于 2011-03-18T15:23:26.473 に答える
12

std::string operationalReason = "";

これは技術的にはまったく問題ありませんが、より一般的で優れているのは

std::string operationalReason;

文字列のデフォルトの ctor は空の文字列を作成します

はい、文字列リテラルが変更不可能なメモリに格納されていることについては正しいですが、文字列 copy-ctor は常に渡された文字列または C 文字列をコピーします。

于 2011-03-18T15:22:47.003 に答える
6

あなただけの場合はどうなりますstd::string operationalReason;か?これは、提供した 2 つの例と同じ効果があるはずです。実際にフォームを使用するときに問題が発生してstd::string operationalReason = "";いる場合は、文字列データ ストレージが破損していることを示している可能性がありますが、同様に、メモリのその他の部分が破損しており、その特定の行が別の方法でマニフェストを引き起こしていることを意味している可能性もあります。

フォームを使用するとすぐにコードがクラッシュ""しますか?それとも後で実行時にクラッシュしますか? これを valgrind などで実行して、メモリの問題が見つかるかどうかを確認できますか? 文字列を 以外のリテラルに初期化するとどうなります""か?

于 2011-03-18T15:50:05.840 に答える
-4

2つの形式は修正されていますが、これは次のとおりです。

std::string operationalReason = ""

const char *を引数とするコンストラクタを呼び出します。最初にデフォルトのコンストラクターを呼び出し、次にデータをコピーしようとしますが、この場合は何もしません。

std::string operationalReason;

が好ましい。を使用clear()して、空の文字列にリセットできます。

于 2011-03-18T15:38:24.057 に答える