int *p1, *p2;
p1 = new int;
p2 = new int;
。あなたはP1参照解除しますが、* p2のと同じ値を取得する際に
a) p1 = p2;
b) *p1 = *p2
int *p1, *p2;
p1 = new int;
p2 = new int;
。あなたはP1参照解除しますが、* p2のと同じ値を取得する際に
a) p1 = p2;
b) *p1 = *p2
A)あなたはp1.Soに(アドレスがある)P2を割り当てています。 * p2を変更すると、* p1も変更されます。基本的に、このタイプの割り当てでは、p1とp2の両方が同じアドレスの場所を参照しています.p1に割り当てられたアドレスはもう参照されないのでメモリリークが発生します。
b)この場合、* p2の値は* p1に割り当てられます。しかし、彼らはまだ異なる住所の場所を指しています。 * p2の値を割り当て後に変更すると、* p1は変更されません。
どのようなタイプの値は、逆参照されたp1とp2のテスト中に私はp1が0137C330です p2は0137C330です * p1は-842150451 キーを押し続けます。 。 。 – CanyoucSharp
ありがとうございました私は今理解していると思います – CanyoucSharp
データタイプをお尋ねしますか?値を印刷してチェックすることができます。 – denis
あなたは言語について言及するのを忘れましたが、あなたはCまたはC++を意味すると思います。
a)シンプルアドレスasigment。 p1
はp2
へのポインタになります。したがって、intの1つのインスタンスを指す2つのポインタで終わります。つまり、p1へのポインタが上書きされてしまいますが、そのメモリはメモリ内に残りますunfreedあなたはそれを解放したり、アクセスすることさえできません! (p1
を別の場所にコピーしていない場合は...)valgrindを使って確認してください。しかし、delete p1
を呼び出すと、p2
が指すintも解放されます。 p2
の使用はおそらくセグメンテーション違反に終わるでしょう。
b)p2の値をp1に割り当てます。つまり、p2の値を持つ2つの動的に割り当てられたポインタで終わることになります。しかし、intの2つの異なるインスタンスになります!したがって、delete p1
の場合は、p2
にアクセスできます。
メモリリークについて受け入れられた回答にコメントを書き始めた後、あなたのことを読んで... upvoteもあります! :) – CompuChip
関連する言語でタグ付けする必要があります。しかし、とにかく、最初の割り当てはポインタを等しくすることです(途中でいくつかのメモリをリークします)。 2番目の値は、ポインターが指す値です。私はそれはかなり明らかだと思う.. –