2016-11-19 143 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

谢谢。我知道了。 @代码学徒 – jbsu32

回答

2

你删除一个指针后,您不能使用它。如果你想显示你的析构函数工作,把它放在它里面而不是在main()中。

2

什么这里是我的问题?我应该如何删除或调用析构函数?

之后你delete s,对象不见了,所以你当然不能再访问它了。在其生命周期外访问对象是一种典型的未定义行为。

对于你的情况,简单地重新排列你的代码会做。

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

正如@代码学徒说。一旦你销毁了这个对象,为此目的而分配的内存就会被释放,所以在你的例子中,你试图访问一块未分配的内存,并导致所谓的NPE(NullPointerException)。

+0

在C中没有NullPointerException异常++和指针指向的东西,它不是空 – Rakete1111

+0

的NullPointerException异常是描述指向空的潜在错误的一种方式。我忘了说这个异常是Java中所谓的。 尽管如此,你是对的。使用删除后,内存被释放并准备好再次使用,就是这样。说它指向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

由于您已删除的指针,调用它会就像去一个没有任何东西的特定目标地址,并期待它做某件事。当指针超出范围时,可以依靠析构函数自动重新分配堆中的内存。