2016-03-22 6 views
1

私は現在、動的メモリ割り当てを学ぶためにC++ prime plusを読んでいました。私はその本でコードを試しましたが、後ろに1行追加した後、私は私が得たものに混乱しました。私はp3のメモリを解放して実際にプリントアウトした後、p3 [2] p3の正しい値しかし、すでにメモリを解放した後に印刷することは不可能ではないでしょうか?ここでC++素数と動的配列の例の混乱

はコードです:

// arraynew.cpp -- using the new operator for arrays 
#include <iostream> 
int main() { 
    using namespace std; 
    double * p3 = new double [3]; // space for 3 doubles 
    p3[0] = 0.2; // treat p3 like an array name 
    p3[1] = 0.5; 
    p3[2] = 0.8; 

    cout << "p3[1] is " << p3[1] << ".\n"; 
    p3 = p3 + 1; // increment the pointer 
    cout << "Now p3[0] is " << p3[0] << " and "; 
    cout << "p3[1] is " << p3[1] << ".\n"; 
    cout << "p3[2] is " << p3[2] << ".\n"; 

    p3 = p3 - 1; // point back to beginning 
    delete [] p3; // free the memory 
    cout << "p3[2] is " << p3[2] << ".\n"; 

    return 0; 
} 

Here is the result:

p3[1] is 0.5. 
Now p3[0] is 0.5 and p3[1] is 0.8. 
p3[2] is 6.95326e-310. 
p3[2] is 0.8. 
+0

出力の実際のテキストを投稿してください。スクリーンショットではありません。 (出力が非常に小さいので、今回はあなたのために編集しました)。 – BoBTFish

+2

未定義の動作が発生しました。言葉のように、そのようなことの結果は未定義です。 – 101010

+0

その実際のC++ Primer Plus –

答えて

5

あなたがメモリを解放すると内容が無効化になります。これが必ずしも削除されているわけではありません。これは、オペレーティングシステムのリソースの無駄になります。割り当て解除とは通常、他のプロセスがHEAPメモリを要求するたびにオペレーティングシステムがこのメモリを自由に使用できることを意味します。その間にこのメモリにアクセスしようとすると、そこに元のコンテンツがある可能性が高くなります。

つまり、割り当てを解除したメモリにアクセスしようとしても、未定義の動作です。元のコンテンツがそこにあるか、すぐに削除されるという保証はありません。何かが起こる可能性がありますので、これをしないでください!

+0

ああ大丈夫です。私はそれを念頭に置いておきます。説明をありがとう、マリノス! – Ahan

+0

私はUBではない別のケースを経験しましたが、割り当てられていない領域を指すポインタを逆参照するときには単に_crash_というプログラムがあります。何が起こっているのか説明できますか? – NERDYLIZARD

+1

"解放された領域を指すポインタの逆参照" IS UB! Btw、単純なクラッシュは、UBの最も一般的な効果です。 –