C ++ Destructors释放内存

时间:2016-06-23 09:22:58

标签: c++

#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岁的年龄?

3 个答案:

答案 0 :(得分:6)

析构函数正在做它应该做的事情,但之后使用指针pallavi 的行为delete未定义

编译器可以执行任何操作,包括打印一些对象。它也可能吃你的猫。

据推测,你只是在课堂上使用指针成员作为练习。对于intstd::string而言,“实际”这样做是没有意义的,甚至是有害的:您班级的实例不再是可复制的。

答案 1 :(得分:1)

您指的是已被删除的内存,这就是C ++中所谓的未定义行为。

当您从堆中删除内存时,C ++不会将内存设置为零。

答案 2 :(得分:0)

删除后,ptr指向的对象处于未定义状态。在您再次将有效对象的地址分配给ptr之前,访问它是未定义的。