2012-02-23 16 views
1

無効なポインタでプログラムがクラッシュする。 gdbを実行すると、クラッシュの原因となった無効なポインタのアドレスがわかります。それがクラッシュした行が削除時に無効なポインタがクラッシュするが、別のポインタ

delete some_pointer; 

あるしかし、私はそれを削除する前に、ポインタを右にプリントアウトしたときに1つのGDBは無効である私に語ったように、アドレスは同じではありません。だからsome_pointer私はそれが問題を引き起こすポインタthatsクラッシュするときに削除しているのですか? gdbが語る -

free(): invalid pointer: 0xbfffea84 *** 

、なぜそれが別のアドレスとの自由にするたびにクラッシュしていましたか?私はちょうど私がここで正しく考えていることを確認したい。

+4

なぜ 'delete'を使用しているときに' C'にタグを付けるのですか? – cnicutar

+1

'some_pointer'のタイプは何ですか? –

+0

アドレスは毎回違うでしょう。すべてのアドレスはです。 – pmr

答えて

0

ほぼ確実に、あなたが見ている削除の前にポインタはdeleteです。ポインタを2回削除すると、記述された症状が正確に発生します。

+1

しかし、私はそれを2回削除しても、それはまだ同じアドレスを持っていませんか? – Sterling

+0

@スターリング:私は実際のポインタ値にあまり重視しません。まず、ポインタ値(内容)ではなくポインタ変数のアドレスのように見えます。第2に、最初の削除が成功したので、その時点で値が何であったのかは分かりません。第3に、別のポインタ値が割り当てられている可能性があります。いくつかのコードを見ることなく、これは必然的に仮想的な推測です。第4に、ポインターの値は、ランダム性(意図的なものであれ、環境への反応であれ)やSELinuxの理由(メモリー・レイアウトをランダム化するもの)など、さまざまな理由から実行ごとに変化する可能性があります。 – wallyk

0

あなたはこのような何かを持っている場合:pの削除中に

struct S 
{ 
    int* p; 
    ~S() { delete p;} 
}; 

S* s; 
std::cout << (void*)s; 
delete s; 

はおそらく、あなたのプログラムがクラッシュしますが、 sが印刷されます。彼らはおそらく異なっているでしょう。

0

複数の継承を持つクラスがある場合は、ポインタのタイプによってアドレスが調整されます。 freeは基本型を使用する必要がありますが、コンパイラはシーンの裏側で目に見えない変換を行うことができるはずです。

関連する問題