我已经使用构造函数和析构函数声明了一个简单的类。但是,当我删除对象时,它会给出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;
}
这里有什么问题?我该如何删除或调用析构函数?
答案 0 :(得分:2)
删除指针后,无法使用它。如果要显示析构函数是否有效,请将cut语句放在其中而不是main()中。
答案 1 :(得分:2)
这里有什么问题?我该如何删除或调用析构函数??
在您delete s
之后,对象消失了,当然您再也无法访问它了。在其生命周期之外访问对象是典型的未定义行为。
对于您的情况,只需重新排序您的代码即可。
cout<<"Name Here -> "<<s->name<<endl;
delete s;
答案 2 :(得分:1)
正如@ Code-Apprentice所说。一旦销毁了该对象,就会释放为此目的分配的内存,因此在您的示例中,您尝试访问未分配的内存块,这会导致所谓的NPE(NullPointerException)。
答案 3 :(得分:1)
从堆中删除之后无法调用某些内容。所以,如果你想使用这一行
cout<<"Name Here -> "<<s->name<<endl;
您应该以删除Student
对象s
答案 4 :(得分:1)
由于你已经删除了指针,因此调用它就像去一个没有任何东西的特定目标地址并期望它做某事。当指针超出范围时,您可以依赖析构函数自动在堆中重新分配内存。