如何删除此对象?
我已经用构造函数和析构函数声明了一个简单的类。但是,当我删除对象时,它会给出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;
}
这是什么问题?我应该如何删除或调用析构函数?
你删除一个指针后,您不能使用它。如果你想显示你的析构函数工作,把它放在它里面而不是在main()中。
什么这里是我的问题?我应该如何删除或调用析构函数?
之后你delete s
,对象不见了,所以你当然不能再访问它了。在其生命周期外访问对象是一种典型的未定义行为。
对于你的情况,简单地重新排列你的代码会做。
cout<<"Name Here -> "<<s->name<<endl;
delete s;
正如@代码学徒说。一旦你销毁了这个对象,为此目的而分配的内存就会被释放,所以在你的例子中,你试图访问一块未分配的内存,并导致所谓的NPE(NullPointerException)。
在C中没有NullPointerException异常++和指针指向的东西,它不是空 – Rakete1111
的NullPointerException异常是描述指向空的潜在错误的一种方式。我忘了说这个异常是Java中所谓的。 尽管如此,你是对的。使用删除后,内存被释放并准备好再次使用,就是这样。说它指向null是错误的,因为这是建议在对象被销毁后手动完成的。我在这个评论中纠正了自己,并添加了一个有趣的话题。 http://*.com/questions/11603005/what-does-delete-command-really-do-for-memory-for-pointers-in-c – cizambra
它不可能调用从堆中其删除后的东西。所以,如果你想使用此行
cout<<"Name Here -> "<<s->name<<endl;
,你应该在你以前使用过的方式重组程序删除Student
对象s
由于您已删除的指针,调用它会就像去一个没有任何东西的特定目标地址,并期待它做某件事。当指针超出范围时,可以依靠析构函数自动重新分配堆中的内存。
删除指针后,无法使用它。 –
谢谢。我知道了。 @代码学徒 – jbsu32