2017-05-04 9 views
1

私は、デストラクタクラスの機能とメモリ割り当て解除に及ぼす影響の挙動を解析するためにこれを書いたが、結果は私には少し意外であるように思わ:デフォルトのデストラクタV.S.単純に定義されたデストラクタ

class test { 
public: 
    test() {} 
    ~test() {} //<-----Run the program once with and once without this line. 
}; 

int main() 
{ 
    test x; 
    test *a(&x); 
    cout << "a before memory allocation: " << a << endl; 
    a = new test; 
    cout << "a after memory allocation and before delete: " << a << endl; 
    delete a; 
    cout << "a after delete: " << a << endl; 

    return 0; 
} 

デフォルトのデストラクタで結果は: enter image description here 私自身のデストラクタで: enter image description here 2番目の結果は間違っていませんか?

解除機能が無効に割り当て解除ストレージの任意の部分を参照するすべてのポインタをレンダリングポインタ、が参照するストレージの割り当てを解除しなければならない。どこかに私はそれを読んでいるので。

多分私はそれを正しくフォローしていないでしょう(特に難しい英語の単語が使われているためです)。なぜこれが起こっているのですか教えてください。 私の単純に定義されたデストラクタとC++のデフォルトデストラクタの違いは何ですか? ご協力いただきありがとうございます。

+1

ポインタが同じままであるという事実は、ストレージが割り当て解除されているという事実と矛盾しません。これは再使用可能なメモリであり、削除したばかりのポインタを使用してこのメ​​モリにアクセスすることは自分の責任です。 – Gerriet

+0

@Gerriet例を挙げますか?ありがとうございました。 –

+0

デフォルトのデストラクタでポインタの変更を再現することはできません:http://ideone.com/vg3TYD – UnholySheep

答えて

2

aオブジェクトに(非ヌル)ポインタである場合、動作delete aa(デフォルトのデストラクタまたは特定のもの)を指し、最後にされていたメモリを解放されたオブジェクトのデストラクタをトリガこのオブジェクトに割り当てられたaが指し示すメモリは有効なオブジェクトではなく、aはもはや参照解除されてはなりません。ただし、delete aは、ポインタaの値を特定の値に戻しません。実際に私はあなたのケースでdelete aaの値を変更したことに驚いています。この現象は再現できません。

+1

デバッグモードのVisual Studioなどの一部のコンパイラでは、無効なアドレスの逆参照を識別するために、削除後にポインタを無効な値に設定します。 – Curg

関連する問題