【问题标题】:C++ Destructors to release memoryC++ 析构函数释放内存
【发布时间】:2016-10-25 12:56:18
【问题描述】:
#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 岁

当然,整个输出是这样的:

Name pallavi
21 岁
释放所有记忆
名称
21 岁。

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

【问题讨论】:

标签: c++


【解决方案1】:

析构函数正在做它应该做的事情,但是使用指针pallavi 你已经deleted之后的行为是未定义。 p>

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

大概您只是在课堂上使用指针成员作为练习。这样做“在现实中”对intstd::string 来说毫无意义,甚至有害:您的类的实例不再可以轻易复制。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-19
        • 1970-01-01
        • 1970-01-01
        • 2014-11-12
        • 1970-01-01
        • 2017-05-25
        • 1970-01-01
        • 2014-11-24
        相关资源
        最近更新 更多