#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。但是在调用析构函数(“delete pallavi”)并再次显示变量时,我收到的输出是:
姓名
年龄21岁
当然,整个输出是这样的:
名称pallavi
21岁
释放所有记忆
名称
年龄21.
我的问题是,析构函数不应该释放回忆吗?这是否意味着第二次显示对象(调用析构函数后),Name和age应显示垃圾值?为什么输出显示没有Name的值和21岁的年龄?
答案 0 :(得分:6)
析构函数正在做它应该做的事情,但之后使用指针pallavi
的行为delete
它未定义
编译器可以执行任何操作,包括打印一些对象。它也可能吃你的猫。
据推测,你只是在课堂上使用指针成员作为练习。对于int
和std::string
而言,“实际”这样做是没有意义的,甚至是有害的:您班级的实例不再是可复制的。
答案 1 :(得分:1)
您指的是已被删除的内存,这就是C ++中所谓的未定义行为。
当您从堆中删除内存时,C ++不会将内存设置为零。
答案 2 :(得分:0)
删除后,ptr指向的对象处于未定义状态。在您再次将有效对象的地址分配给ptr之前,访问它是未定义的。