1

私は C/CPP アプリケーションの初心者で、C/CPP コードの問題を分析しています。セグメンテーション違反エラーが発生しましたが、セグメンテーション違反の根本原因を特定するつもりはありません。

以下のシナリオを見つけてください。

union Value {

   int value_int;
   float value_float;
   RWCString *value_string;

}

void setValueString(const RWCString &value_string_arg)
{
   *(value.value_string) = value_string_arg; //value は UNION 値への参照です。
}

アプリケーションがこのコードを使用すると、実行時にセグメンテーション違反を生成して終了します。コンソール出力ステートメントをいくつか配置し、セグメンテーション違反が原因である可能性があることを理解しました

   *(value.value_string) = value_string_arg;

ライン。

誰かが私のセグメンテーション違反の識別を検証してくれませんか? また、この問題を回避する方法についてはよくわかりません。同じことを考えている人がいたら教えてください。

どんな助けでも大歓迎です。ありがとう

〜ジェガン

4

4 に答える 4

3

あなたはおそらく次のようなことをしたいと思うでしょう:

value.value_string = new RWCString(value_string_arg);

あなたのコードでvalue.value_stringは、 が初期化されていないポインタである場合、実行している割り当てはメモリのランダムな部分に書き込もうとし、セグメンテーション値を引き起こします。上記のコードでは、newオペレーターは a に新しいメモリ ブロックを割り当て、コピー コンストラクターRWCStringを呼び出してをコピーします。次に、新しく割り当てられたメモリ ブロックへのポインタを に割り当てます。value_string_argvalue.value_string

delete value.value_stringメモリ リークを避けるために、作業が終わったら忘れないでください。

于 2010-11-15T20:39:21.147 に答える
2

を実行すると、ポインタ*(value.value_string)逆参照されます。つまり、 が指すものvalue.value_stringの値を設定するようコンパイラに要求します。有効なメモリを指していることを確認する必要があります。そうしないと、それに割り当てると、メモリ内のランダムな場所に書き込むことになるため、セグメンテーション違反が発生します。

value.value_string = new RWCString;C++では、通常、事前に次のようなことを行うことで有効なメモリを取得します(delete完了したら確認します)。ただし、ポインターの結合を作成したため、これはあなたの状況では危険です。eg に書き込むとすぐにvalue.value_float、ポインタ値が失われ、メモリ リークが発生します。

于 2010-11-15T20:39:13.343 に答える
2

gdb でコア ダンプを分析してみてください。コア ダンプには、セグ フォールトが発生している場所が正確に表示されます。デバッグを有効にしてコンパイルする必要があります。

于 2010-11-15T20:39:41.193 に答える
0

(使用している言語は C++ です。C/CPP や C/C++ ではありません。)

ここでの主な問題: を使用していunionます。unionあるメンバーを初期化してから別のメンバーを使用しようとすると、爆発するため、初心者はおそらく s を使用しないでください。

何もないふりをunionして、実際にRWCString*ポインターを持っている場合: 有効なオブジェクトを指していると確信していますか? いつRWCString建設され、その寿命は?

もちろん、セグメンテーション違反は常に無効なコードで発生するとは限りません。その前に別の悪いことが起こり、後で噛まれる可能性があります。

于 2010-11-15T20:41:12.177 に答える