2016-04-05 7 views
-2

2. 、ダイナミックポインタ代入C++の定義を考えると

int *p1, *p2; 
p1 = new int; 
p2 = new int; 

。あなたはP1参照解除しますが、* p2のと同じ値を取得する際に

a) p1 = p2; 
b) *p1 = *p2 
+1

関連する言語でタグ付けする必要があります。しかし、とにかく、最初の割り当てはポインタを等しくすることです(途中でいくつかのメモリをリークします)。 2番目の値は、ポインターが指す値です。私はそれはかなり明らかだと思う.. –

答えて

1

A)あなたはp1.Soに(アドレスがある)P2を割り当てています。 * p2を変更すると、* p1も変更されます。基本的に、このタイプの割り当てでは、p1とp2の両方が同じアドレスの場所を参照しています.p1に割り当てられたアドレスはもう参照されないのでメモリリークが発生します。

b)この場合、* p2の値は* p1に割り当てられます。しかし、彼らはまだ異なる住所の場所を指しています。 * p2の値を割り当て後に変更すると、* p1は変更されません。

+0

どのようなタイプの値は、逆参照されたp1とp2のテスト中に私はp1が0137C330です p2は0137C330です * p1は-842150451 キーを押し続けます。 。 。 – CanyoucSharp

+0

ありがとうございました私は今理解していると思います – CanyoucSharp

+0

データタイプをお尋ねしますか?値を印刷してチェックすることができます。 – denis

2

あなたは言語について言及するのを忘れましたが、あなたはCまたはC++を意味すると思います。

a)シンプルアドレスasigment。 p1p2へのポインタになります。したがって、intの1つのインスタンスを指す2つのポインタで終わります。つまり、p1へのポインタが上書きされてしまいますが、そのメモリはメモリ内に残りますunfreedあなたはそれを解放したり、アクセスすることさえできません! (p1を別の場所にコピーしていない場合は...)valgrindを使って確認してください。しかし、delete p1を呼び出すと、p2が指すintも解放されます。 p2の使用はおそらくセグメンテーション違反に終わるでしょう。

b)p2の値をp1に割り当てます。つまり、p2の値を持つ2つの動的に割り当てられたポインタで終わることになります。しかし、intの2つの異なるインスタンスになります!したがって、delete p1の場合は、p2にアクセスできます。

+0

メモリリークについて受け入れられた回答にコメントを書き始めた後、あなたのことを読んで... upvoteもあります! :) – CompuChip

関連する問題