#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和字符串名称。但是在调用destructor(“delete pallavi”)并再次显示变量时,我收到的输出是:

名称
21岁


当然,整个输出是这样的:
名称pallavi
21岁
释放了所有的回忆
名称
年龄21.


我的问题是,析构函数不应该释放记忆吗?这是否不意味着在再次显示对象(调用析构函数之后)时,名称和年龄应该显示垃圾值?为什么输出中没有显示“名称”值和“21”的年龄值?

最佳答案

析构函数正在执行应做的事情,但是在您将pallavi命名为之后,使用指针delete的行为是不确定的。

编译器可以做任何事情,包括打印一些对象。它也可能会吃掉你的猫。

大概您只是在类里面使用指针成员作为练习。对于intstd::string而言,“实际上”这样做是毫无意义的,甚至是有害的:您的类实例不再是可复制的。

关于c++ - C++析构函数以释放内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37987406/

10-11 23:15
查看更多