2016-06-23 25 views
0
#include<iostream> 
#include<string> 
using namespace std; 

class Human{ 
    private: 
     int *age; 
     string *name; 
    public: 
     Human(string iname,int iage) 
     { 
      name=new string; 
      age=new int; 
      *name=iname; 
      *age=iage;   
     } 
     void display() 
     { 
      cout<<"Name "<<*name<<endl<<"Age "<<*age<<endl; 
     } 
     ~Human(){ 
      delete name; 
      delete age; 
      cout<<"Released all memories"<<endl; 
     } 

}; 
int main() 
{ 
    Human *pallavi= new Human("pallavi",21); 
    pallavi->display(); 
    delete pallavi; 
    pallavi->display(); 
    return 0; 
} 

私は、クラスHumanのオブジェクトを作成する簡単なプログラムを書いています。デストラクタは、データ変数、すなわち、int ageおよびstring nameの両方を削除するように指定される。しかし、(「パラヴィを削除」)デストラクタを呼び出し、再度変数を表示するには、私が受け取る出力は次のようになります。
C++デストラクタがメモリを解放する

名前
年齢21もちろん

は、全体の出力は以下です:

名前パラヴィ
年齢21
リリースすべての思い出
名前
年齢21

私の質問は、デストラクタがメモリを解放すべきではないですか?それは、オブジェクトを2度表示すると(デストラクタを呼び出した後に)、名前と年齢がガベージ値を表示するはずですか? Nameに21の値が表示され、21に値が表示されないのはなぜですか?

+2

メンバー変数にポインタを使用する必要はありません。ちょうど 'int'と' string'とタイプするだけです。 – Sean

+1

ちょうど開発を開始し、古いコンパイラを使用しない場合は、[スマートポインタ](http://stackoverflow.com/questions/106508/what-is-a-smart-pointer-and-when-should -i-use-one) – Garf365

+1

[C++ deleteの複製が可能です - オブジェクトを削除しますが、それでもデータにアクセスできますか?](http://stackoverflow.com/questions/1930459/c-delete-it-deletes-myデータにアクセスすることはできますが、オブジェクトにアクセスできます) –

答えて

5

デストラクタは何それはするべきやっているが、ポインタ後pallaviを使用しての行動は、あなたはそれが未定義あるdelete Dをしました。

コンパイラは、オブジェクトの一部を印刷するなど、何でも行うことができます。あなたの猫も食べるかもしれません。

おそらく、練習としてクラス内でポインタメンバーを使用しているだけです。実際にはintstd::stringは無意味であり、さらに危険です。あなたのクラスのインスタンスはもはや簡単にコピーできません。

1

既に削除されているメモリを参照していますが、これはC++で未定義の動作と呼ばれています。

ヒープからメモリを削除すると、メモリがゼロに設定されません。

0

削除後、ptrが指すオブジェクトは未定義の状態です。有効なオブジェクトのアドレスをptrに再度割り当てるまで、アクセスは未定義です。

関連する問題