2016-11-19 10 views
2

私はコンストラクタとデストラクタを使って簡単なクラスを宣言しました。しかし、オブジェクトを削除すると、runtime errorとなり、それ以上の出力は実行されません。このオブジェクトを削除するには?

class Student { 
public: 
    string name; 

    Student(string name) { 
     this->name=name; 
    } 

    ~Student() { 
     this->name=""; 
    } 

}; 

int main() { 
    Student* s = new Student("a"); 
    cout<<s->name<<endl; 
    delete s;         /// Problem In This Line 
    cout<<"Name Here -> "<<s->name<<endl; 
    return 0; 
} 

私の問題は何ですか?デストラクタを削除または呼び出すにはどうすればよいですか?

+4

ポインタを削除した後は使用できません。 –

+0

ありがとうございます。わかった。 @ Code-Apprentice – jbsu32

答えて

2

ポインタを削除した後は使用できません。デストラクタがうまく動作していることを示すには、main()ではなくcut文を内部に配置します。

2

私の問題は何ですか?デストラクタを削除または呼び出すにはどうすればよいですか?

delete sの後は、オブジェクトがなくなったため、もはやそのオブジェクトにアクセスできなくなりました。生存期間外のオブジェクトへのアクセスは、典型的な未定義の動作です。

あなたの場合は、コードの順序を変更するだけです。

cout<<"Name Here -> "<<s->name<<endl; 
delete s; 
1

@ Code-Apprenticeと同じです。オブジェクトを破棄すると、その目的のために割り当てられたメモリが解放されるので、割り当てられていないメモリブロックに到達しようとする例では、NPE(NullPointerException)が発生します。

+0

C++でNullPointerExceptionが存在せず、ポインターが何かを指している、それがヌルではない – Rakete1111

+0

NullPointerExceptionはnullを指す可能性のあるエラーを記述する1つの方法でした。私はこの例外がJavaで呼び出されたものであると言っていることを忘れていました。 それでも、あなたは正しいです。 deleteを使用した後、メモリは解放され、もう一度使用できる状態になります。これは、オブジェクトが破棄された後に手動で行われることが示唆されているため、nullを指していると言うのは誤りです。私はこのコメントで自分自身を修正し、関連する興味深いトピックを追加します。 http://stackoverflow.com/questions/11603005/what-does-delete-command-really-do-for-memory-for-pointers-in-c – cizambra

1

ヒープから削除した後に何かを呼び出すことはできません。あなたは

cout<<"Name Here -> "<<s->name<<endl;

このラインを使用する場合、あなたはすでにそれを考え呼び出して、ポインタを削除したので、あなたはStudentオブジェクトにs

1

を削除する前に、あなたはその使用方法であなたのプログラムを再構築すべきです何もない特定のターゲットアドレスに行き、何かをすることを期待しているようになります。デストラクタを使用すると、ポインタが有効範囲外になったときにヒープ内のメモリを自動的に再割り当てできます。

関連する問題