2016-07-21 11 views
1

C++のdelete演算子を理解しようとしています。C++で新しい演算子と削除演算子の背後にある論理を理解してください

私はポインタとnew演算子を使用しての背後にある論理を理解することができ、まだ私は「は、delete演算子は、動的変数を排除し、動的変数は軟石に占有するメモリを返します。」P517、問題はCで解決することを理解++第9版。

私は第3のcoutステートメントには合わないと思います。私は第3のcoutステートメントが最初のものと同様のsthであることを期待しました。

int main() { 
    int *p1; 
    cout << "p1 address: " << &p1 << " and points to the address "<< p1 << " which has the value: " << *p1<< endl; 

    p1 = new int; 
    cout << "p1 address: " << &p1 << " and points to the address "<< p1 << " which has the value: " << *p1<< endl; 

    delete p1; 
    cout << "p1 address: " << &p1 << " and points to the address "<< p1 << " which has the value: " << *p1<< endl; 

    cout << endl; 
    return 0; 
} 

私は:)任意の説明をお願い申し上げます)

+0

ポインタの値は変更されません。あなたは何を期待しましたか?削除後のポインタを使用するbtwは – Incomputable

+3

を呼び出します。これらの出力はすべてUBです。初期化されていないポインタを最初に表示して逆参照し、2番目に未初期化変数を読み取ります。 – BeyelerStudios

+0

私はそれが指しているメモリアドレスが異なる値を持つと予想しました。あたかもポインタが初期化されていないかのように! – Zingo

答えて

1

deleteは、メモリをあなたのポインタポイントを変更する必要はありません。実際には、実装固有のものです。

deleteは、指定されたアドレスの任意のオブジェクトを分解し、関連付けられたメモリを割り当てプールに戻すことが必要です。一部のデバッガは解放されたときに変数の値を上書きすることがありますが、単純な型の場合は特別な分解を行う必要はありません。メモリはそのままプールに返すことができます。ポインタは変更されません。delete pの後に、pダングリングポインタを呼び出して解放されたメモリのアドレスを保持します。そのポインタを介したすべてのアクセスは、未定義の動作です。

生ポインタと特にぶら下がっているポインタを処理するとエラーが発生しやすいので、C++ smartpointersを知っておいてよかったです。 unique_ptr

std::unique_ptr<int> p;  // initialised to nullptr 
p = std::make_unique<int>(13); // new int with value 13 
p = std::make_unique<int>(37); // deleted previous int, assigned new int with value 37 
// optional (when p goes out of scope its pointee is deleted automatically) 
p.reset();      // deleted the int and reset p to nullptr