C++析构函数以释放内存

C++ Destructors to release memory

本文关键字:内存 释放 析构函数 C++      更新时间:2023-10-16
#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 和字符串名称。但是在调用析构函数("删除 pallavi")并再次显示变量时,我收到的输出是:

姓名年龄
21

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

姓名 帕拉维
21岁 释放所有记忆
姓名
21
岁。

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

析构函数正在做它应该做的事情,但是在你delete它之后使用指针pallavi的行为是不确定的。

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

大概您只是在类中使用指针成员作为练习。"实际上"这样做对intstd::string毫无意义,甚至是有害的:你的类的实例不再是微不足道的可复制的。

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

C++ 不会在从堆中删除内存时将其设置为零。

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